【Kotlin/Android】ネットワーク接続状態を取得・監視する方法!ConnectivityManager

【Kotlin/Android】ネットワーク接続状態を取得・監視する方法!ConnectivityManager

この記事からわかること

  • Android Studio/KotlinConnectivityManager使い方
  • ネットワーク接続状態取得監視する方法
  • NetworkRequestNetworkCallbackの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

ネットワーク接続状態を取得する方法

Android/Kotlinでネットワーク接続状況を取得するにはConnectivityManagerを使用します。先に手順をまとめていきます。

ネットワーク接続状態を取得する手順

  1. マニフェストファイルにパーミッションを追加
  2. ConnectivityManagerインスタンスを取得
  3. ネットワーク状態を保持する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を取得

続いてConnectivityManagergetNetworkCapabilitiesメソッドの引数に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を使用します。先に手順をまとめていきます。

ネットワーク接続状態を取得する手順

  1. マニフェストファイルにパーミッションを追加
  2. ConnectivityManagerインスタンスを取得
  3. NetworkRequestインスタンスを生成
  4. 監視用コールバックの実装
  5. 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にセット

最後にConnectivityManagerNetworkRequestConnectivityManager.NetworkCallbackをセットすれば完了です。この状態でネットワーク状態が変化するたびにそれぞれのコールバックメソッドが呼ばれるようになります。

connectivityManager.requestNetwork(networkRequest, networkCallback)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index