17
9

More than 3 years have passed since last update.

【Android/Kotlin】インターネット接続の確認とNetworkInfo非推奨の解消

Last updated at Posted at 2020-08-09

開発環境

  • macOS 10.15.5
  • Android Studio 4.0
  • Kotlin 1.3.72

やりたいこと

サーバーとの通信の前に端末がインターネットに接続されているかどうかを確認したい。

NetworkInfoを使う方法

デベロッパーガイドの接続ステータスの特定と監視(2020/08/09アクセス)によると、ConnectivityManagerを使用すれば、インターネットに接続されているか、接続されている場合はどのようなタイプかを確認できるそうです。

ということで、ボタンが押されると接続状況が確認され、接続のタイプを表示する簡単な実装を行いました。
(マニフェストファイルにパーミッションを追加するのを忘れないようにしましょう)

AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
MainActivity.kt
        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はアクティブなネットワークの能力を表すクラスです。
以下のように実装できるかと思います。

MainActivity.kt

        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以上必要です

参考

を参考にさせていただきました。

17
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
9