Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出

以前は、 ConnectivityManager.CONNECTIVITY_ACTIONインテントを受けて、ネットワーク接続の状態の情報を得ることができました。 しかし、Android 7.0(API 24)以上のバージョンをターゲットにするアプリは、このインテントを受け取ることができません。

今ブロードキャストレシーバにネットワーク(WIFI)の接続情報を取得することができず、 registerNetworkCallback() APIでリスナーを登録して受けることができるように変更されました。 (パフォーマンスの問題にBroadcast方式でListener方式に変更したものです。)

サンプルコードは、すべてのkotlinで作成されました。

ネットワーク(WIFI)接続状態情報取得

まず、 AndroidManifest.xmlに次のようにパーミッションを要求する必要があります。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

以下は、callbackオブジェクトを生成してリスナーを登録、解除するコードです。

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        Log.d("Test", "wifi available")
    }

    override fun onLost(network: Network?) {
        Log.d("Test", "wifi unavailable")
    }
}

private fun registerNetworkCallback() {
    val cm = getSystemService(ConnectivityManager::class.java)
    val wifiNetworkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build()
    cm.registerNetworkCallback(wifiNetworkRequest, networkCallback)
}

private fun unregisterNetworkCallback() {
    val cm = getSystemService(ConnectivityManager::class.java)
    cm.unregisterNetworkCallback(networkCallback)
}
  • onAvailable():WIFIが接続されると呼び出されます。 WIFIが接続された状態でのリスナーが登録されるように呼び出されます
  • onLost():WIFI接続が切断されると呼び出されます。 WIFIが接続されていない状態で、リスナーが登録されるように呼び出されません

そして、次のように onResume()でリスナーを登録して onStop()でリスナーを終了します。

override fun onResume() {
    super.onResume()
    registerNetworkCallback()
}

override fun onStop() {
    super.onStop()
    unregisterNetworkCallback()
}

ネットワーク(WIFI)の接続情報を取得する

WIFIが接続されていない状態で、リスナーが登録されるように onLost()は呼び出されません。

以下は、リスナーを登録せずにWIFI接続の状態を取得するコードです。

fun isWIFIConnected(context: Context): Boolean {
    var result = false
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager
    val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
    if (capabilities != null) {
        if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            result = true
        } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            result = false
        }
    }
    return result
}

参考

Related Posts

codechachaCopyright ©2019 codechacha