🏐

Androidインターネット接続の有無と種類を確認する

2023/12/04に公開

最初に

スマートフォンの通信は大きくWi-Fiと4G/LTEで連結された状態に分けることができます。

今回の記事では、ネットワークの状態に応じて適切な処理ができるように、インターネット接続の有無と接続の種類を確認する方法をまとめようとします。

ユーザー権限要請

まず、端末機のインターネット接続状態にアクセスできるよう権限を要請しなければならないです。 manifestにコードを追加すます。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

インターネット接続の確認

接続状態を確認するためにConnectivity Managerオブジェクトが必要です。 Connectivity Managerを使えば、インターネットに実際に接続されているのか、接続されている場合はどのようなタイプの接続なのか確認できます。

システムサービスオブジェクトをインポートするためにgetSystemService()メソッドを使用します。

getActiveNetworkInfo()

メソッドはネットワーク接続情報を得るために使用する。

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();

boolean isConnected = (networkInfo != null && networkInfo.isConnectedOrConnecting());

インターネット接続状態を確認するメソッドを含むクラスの例

public class NetworkStatus {

 public static boolean isConnected(Context context) {
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo networkInfo = manager.getActiveNetworkInfo();

     return networkInfo != null && networkInfo.isConnectedOrConnecting();
 }
}

接続の種類確認

接続のタイプを確認するときは、getType()メソッドを使います。
接続の種類はConnectivity Managerクラスに定数で定義されています。

   switch (networkInfo.getType()) {
        case ConnectivityManager.TYPE_MOBILE:
            System.out.println("4G/LTE 連結");
            break;

        case ConnectivityManager.TYPE_WIFI:
            System.out.println("WIFI 連結");
            break;
    }

API 29 以降

Network Info クラスは、api level 29 でdeprecatedされました。
公式文書を読んでみると、代わりにConnectivityManager.NetworkCallbackを使用するようにと出ています。
Network Callback クラスは、ネットワーク状態が変更されたときにブロードキャストメッセージを受信する代わりにコールバックを呼び出します。

Network Request はネットワークに対する要求を定義します。

NetworkRequest.Builderで作られたオブジェクトには、builder.addCapability(...).addCapability(...); このようにコールバックに対する設定を指定することができます。

addCapability(intcapability)

特定の要求事項を満たす通信に対してコールバックを呼び出すよう設定します。

addTransportType(inttransportType)

特定の種類の通信に対してコールバックを呼び出すように設定します。

NetworkRequest.Builder builder = new NetworkRequest.Builder();
        manager.registerNetworkCallback(builder.build(), new ConnectivityManager.NetworkCallback(){
            @Override
            public void onAvailable(@NonNull Network network) {
                // ネットワークを使用する準備ができた時
            }

            @Override
            public void onLost(@NonNull Network network) {
                // ネットワークが切れた時
            }
        });

Discussion