開発環境
- macOS 10.15.5
- Android Studio 4.0
- Kotlin 1.3.72
やりたいこと
サーバーとの通信の前に端末がインターネットに接続されているかどうかを確認したい。
##NetworkInfo
を使う方法
デベロッパーガイドの接続ステータスの特定と監視(2020/08/09アクセス)によると、ConnectivityManager
を使用すれば、インターネットに接続されているか、接続されている場合はどのようなタイプかを確認できるそうです。
ということで、ボタンが押されると接続状況が確認され、接続のタイプを表示する簡単な実装を行いました。
(マニフェストファイルにパーミッションを追加するのを忘れないようにしましょう)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
val text = findViewById<TextView>(R.id.textView)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
val connectionType = activeNetwork?.type
if (isConnected) {
text.text = when (connectionType) {
ConnectivityManager.TYPE_WIFI -> "Wifiに接続しています"
ConnectivityManager.TYPE_MOBILE -> "モバイル通信に接続しています"
else -> "その他のネットワークに接続しています"
}
} else {
text.text = "インターネットに接続していません"
}
}
以上のようにすればインターネットの接続が確認できますが、APIレベル29でConnectivityManager.getActiveNetworkInfo()
と NetworkInfo
が非推奨となったため、AndroidStudioでは取り消し線が引かれてしまいます。
これを解消するためにNetworkInfo
クラスの代わりにConnectivityManager.getNetworkCapabilities()
を使うことにします。
ConnectivityManager.getNetworkCapabilities()
を使う方法
NetworkCapabilities
はアクティブなネットワークの能力を表すクラスです。
以下のように実装できるかと思います。
button.setOnClickListener {
// ConnectivityManagerの取得
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// NetworkCapabilitiesの取得
// 引数にcm.activeNetworkを指定し、現在アクティブなデフォルトネットワークに対応するNetworkオブジェクトを渡している
val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
if (capabilities != null) {
text.text = when {
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ->
"Wifiに接続しています"
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ->
"モバイル通信に接続しています"
else -> "その他のネットワークに接続しています"
}
} else {
text.text = "インターネットに接続していません"
}
}
*NetworkCapabilities
はAPI21、ConnectivityManager.getActiveNetwork()
API23で追加されたので、APIレベル23以上必要です
参考
- はてなブログの記事 「Android 10 時代の Connectivity Monitoring 」(2020/08/09アクセス)
-
Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
(2020/08/09アクセス)
を参考にさせていただきました。