ConnectivityManager
は、デバイスの機能やデータ転送オプションなど、さまざまな条件に基づいてデバイスがネットワークに接続するようリクエストできる API を提供します。
コールバックの実装は、デバイスの接続ステータスと現在接続されているネットワークの機能に関する情報をアプリに提供します。この API を使用すると、デバイスが現在、アプリの要件を満たすネットワークに接続されているかどうかを判断できます。
ネットワーク リクエストを構成する
ネットワークの転送タイプ(Wi-Fi 接続やモバイル接続など)と、現在接続されているネットワークの機能(インターネット接続など)を指定するには、ネットワーク リクエストを構成する必要があります。
アプリのネットワーク接続の要件を記述する NetworkRequest
を宣言します。次のコードは、インターネットに接続されているネットワークのリクエストを作成し、トランスポート タイプに Wi-Fi 接続またはモバイル接続を使用します。
Kotlin
val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Java
NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build();
接続によっては、他の接続よりも大幅に費用が高くなる場合があります(たとえば、モバイル接続は通常高額です)。NetworkCapabilities#NET_CAPABILITY_NOT_METERED
を使用して、接続が高コストかどうかを判断します。従量制の接続を使用しているときは、アプリのデータ使用量を減らすか、デバイスが従量制でない接続になるまで待つようにしてください。
ネットワーク コールバックを設定する
NetworkRequest
を ConnectivityManager
に登録する場合は、接続ステータスとネットワーク機能の変更に関する通知を受け取るために NetworkCallback
を実装する必要があります。
NetworkCallback
で最も一般的に実装される関数には、次のようなものがあります。
onAvailable()
は、デバイスがNetworkRequest
で指定された機能とトランスポート タイプの要件を満たす新しいネットワークに接続されていることを示します。onLost()
はデバイスがネットワークへの接続を失ったことを示します。onCapabilitiesChanged()
は、ネットワークの機能が変更されたことを示します。NetworkCapabilities
オブジェクトは、ネットワークの現在の機能に関する情報を提供します。
Kotlin
private val networkCallback = object : ConnectivityManager.NetworkCallback() { // network is available for use override fun onAvailable(network: Network) { super.onAvailable(network) } // Network capabilities have changed for the network override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { super.onCapabilitiesChanged(network, networkCapabilities) val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) } // lost network connection override fun onLost(network: Network) { super.onLost(network) } }
Java
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); } @Override public void onLost(@NonNull Network network) { super.onLost(network); } @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities); final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } };
ネットワークの最新情報に登録する
NetworkRequest
と NetworkCallback
を宣言したら、requestNetwork()
関数または registerNetworkCallback()
関数を使用して、NetworkRequest
を満たすデバイスから接続するネットワークを検索します。ステータスは NetworkCallback
に報告されます。
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager connectivityManager.requestNetwork(networkRequest, networkCallback)
Java
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(ConnectivityManager.class); connectivityManager.requestNetwork(networkRequest, networkCallback);