【Kotlin/Android】ネットワーク接続状態を取得・監視する方法!ConnectivityManager
この記事からわかること
- Android Studio/KotlinのConnectivityManagerの使い方
- ネットワーク接続状態を取得・監視する方法
- NetworkRequestとNetworkCallbackの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
ネットワーク接続状態を取得する方法
Android/Kotlinでネットワーク接続状況を取得するにはConnectivityManager
を使用します。先に手順をまとめていきます。
ネットワーク接続状態を取得する手順
- マニフェストファイルにパーミッションを追加
- ConnectivityManagerインスタンスを取得
- ネットワーク状態を保持するNetworkCapabilitiesを取得
1.マニフェストファイルにパーミッションを追加
ネットワーク接続状態を取得可能にするためにはマニフェストファイルに以下を記述する必要があります。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.ConnectivityManagerインスタンスを取得
ConnectivityManager
インスタンスはAndroidのシステムサービスを取得するためのgetSystemService
メソッドにCONNECTIVITY_SERVICE
キーを渡して取得します。
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
3.ネットワーク状態を保持するNetworkCapabilitiesを取得
続いてConnectivityManager
のgetNetworkCapabilities
メソッドの引数にconnectivityManager.activeNetwork
を渡すことでネットワークの接続状況を取得するためのNetworkCapabilitiesインスタンスを取得できます。
val networkCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
インターネット接続の種類を識別する
オンライン(Wi-Fi or キャリア通信)やオフラインかを識別するためには以下のように実装します。NetworkCapabilities
自体が取得できていなければオフライン環境ということになります。
if (networkCapabilities != null) {
var state = when {
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ->
"Wi-Fiに接続中"
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ->
"キャリア通信に接続中"
else -> "その他のネットワークに接続中"
}
Log.e("NetWork", state)
} else {
Log.e("NetWork", "オフライン状態")
}
ネットワーク接続状態を監視する方法
ネットワーク接続状態を監視してなんらかの処理を実装するにはNetworkRequest
を使用します。先に手順をまとめていきます。
ネットワーク接続状態を取得する手順
- マニフェストファイルにパーミッションを追加
- ConnectivityManagerインスタンスを取得
- NetworkRequestインスタンスを生成
- 監視用コールバックの実装
- ConnectivityManagerにセット
1.マニフェストファイルにパーミッションを追加
ネットワーク接続状態を監視可能にするためにはマニフェストファイルに以下を記述する必要があります。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
2.ConnectivityManagerインスタンスを取得
ConnectivityManager
インスタンスは先ほどと同じ手順です。
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
3.NetworkRequestインスタンスを生成
NetworkRequest
インスタンスを作成する際に監視したいネットワークを指定します。
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build()
3.監視用コールバックの実装
ネットワーク状態が変化した際に呼ばれるコールバック(ConnectivityManager.NetworkCallback)を実装します。それぞれのメソッドから以下の変化を検知することができるようになります。
val networkCallback = object : ConnectivityManager.NetworkCallback() {
// ネットワークが利用可能になったときに呼ばれる
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.e("NetWork", "ネットワークが利用可能になりました")
}
// ネットワークの特性が変化した際に呼ばれる
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
Log.e("NetWork", "ネットワークの特性が変化した")
}
// ネットワークが失われた際に呼ばれる
override fun onLost(network: Network) {
super.onLost(network)
Log.e("NetWork", "ネットワークが失われました")
}
}
onCapabilitiesChanged
の特性とはWi-Fiからキャリア通信などの変化を検知することができるようになります。
4.ConnectivityManagerにセット
最後にConnectivityManager
にNetworkRequest
とConnectivityManager.NetworkCallback
をセットすれば完了です。この状態でネットワーク状態が変化するたびにそれぞれのコールバックメソッドが呼ばれるようになります。
connectivityManager.requestNetwork(networkRequest, networkCallback)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。