はじめに
タイトル通り、今までWi-Fi接続状況を監視するのに、ConnectivityManager#CONNECTIVITY_ACTION
をBroadcastReceiverに登録して監視していましたが、公式を見るとAPIレベル28で廃止されるとのことなので、ConnectivityManager#requestNetwork
を使用して監視してみました。
ConnectivityManager#CONNECTIVITY_ACTION
CONNECTIVITY_ACTION.kt
// Receiver登録
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).also {
registerReceiver(wifiBroadcastReceiver, it)
}
// Receiver
val wifiBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork = cm.activeNetworkInfo
activeNetwork.also { info ->
val isConnected = info.isConnectedOrConnecting
val isWifi = info.type == ConnectivityManager.TYPE_WIFI
val isMobile = info.type == ConnectivityManager.TYPE_MOBILE
}
}
}
ConnectivityManager#requestNetwork
requestNetwork.kt
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val request = NetworkRequest
.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build()
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network?) {
super.onAvailable(network)
// ネットワークが使用可能になったときの処理
val capabilities = cm.getNetworkCapabilities(network)
val isWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
val isMobile = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
}
override fun onLost(network: Network?) {
super.onLost(network)
// ネットワークの接続が切れたときの処理
}
override fun onUnavailable() {
super.onUnavailable()
// ネットワークが使用不可になったときの処理
}
}
cm.requestNetwork(request, networkCallback)
おわりに
ConnectivityManager#requestNetwork
はWi-Fiだけでなく、様々なネットワークと状態を監視できます。より汎用的になった、ということでしょうか。