NetworkInfoを使って、通信接続が可能状態か知る


前回、PhoneStateListenerで回線の接続状況の変化を取得するにおいて3G回線の接続状態を取得する方法を紹介しました。

アプリケーション作成に当たっては、3G/Wifiを意識せずに、ネットワーク通信が可能な状態であるかを知りたい時があると思います。
NetworkInfo Classを用いて、ネットワーク通信の接続 可/不可 状態をチェックする方法を紹介します。


ネットワーク通信状態を取得する為には、下記の3点が必要となります。

  • AndroidManifestへの「ACCESS_NETWORK_STATE」 Permissionの付与
  • ConnectivityManagerの取得
  • NertworkInfoクラスの使用

それでは、一つずつ見ていきましょう。

●AndroidManifestへの「Permission」の付与

前回、PhoneStateListenerを利用した際には、READ_PHONE_STATEのPermissionが必要でした。
今回は、SystemServiceからConnectivityManagerを取得するために、ACCESS_NETWORK_STATEのPermissionが必要となります。

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

●ConnectivityManagerの取得

ConnectivityManagerをSystemServerから取得します。
※マニフェストファイルへのPermissionの付与を忘るとエラーで落ちます。

取得方法は、Activity#getSystemService() に CONNECTIVITY_SERVICEを渡すことで取得します。

1
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

●NetworkInfoクラスの使用

NetworkInfo#isConnectedを使用することで、ネットワークの接続状態を true/false で取得することができます。
NetworkInfoクラスでは他に、現在のネットワーク状態の詳細(CONNECTING、CONNECTED、SCANNINGなど)をENUM値で保持している、NetworkInfo.State型やNetworkInfo.DetailedState 型のステータスを取得したりもすることができます。

最後に、NetworkInfoクラスの使用方法とともに、作成したサンプルアプリのソースを貼り付けます。
作成したアプリケーションでは、ボタン押下時に、ネットワークの状態を取得し、画像を変更しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class MainSample extends Activity implements OnClickListener {
    ConnectivityManager cm;
    ImageView iv;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        /* ConnectivityManagerの取得 */
        cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
 
        /* コンポーネントの接続 */
        Button bt = (Button) findViewById(R.id.checkbutton);
        bt.setOnClickListener(this);
 
        iv = (ImageView) findViewById(R.id.imageView1);
    }
 
    @Override
    public void onClick(View v) {
        NetworkInfo nInfo = cm.getActiveNetworkInfo();
 
        if (nInfo == null) {
            Toast.makeText(this, "No Network Connection!", Toast.LENGTH_LONG)
                    .show();
            iv.setImageResource(R.drawable.indicator_input_error);
            return;
        }
 
        if (nInfo.isConnected()) {
            /* NetWork接続可 */
            Toast.makeText(this, nInfo.getTypeName() + "接続なう",
                    Toast.LENGTH_LONG).show();
            if (nInfo.getTypeName().equals("WIFI")) {
                iv.setImageResource(R.drawable.wifi);
            } else if (nInfo.getTypeName().equals("mobile")) {
                iv.setImageResource(R.drawable.mobile);
            }
 
        } else {
            /* NetWork接続不可 */
            Toast.makeText(this, "No Network Connection!", Toast.LENGTH_LONG)
                    .show();
            iv.setImageResource(R.drawable.indicator_input_error);
        }
    }
}

※NetworkInfo#getTypeNameにて、種別をStringで取得していますが、“WIFI” “mobile”の文字列に注意してください。
Referenceには”WIFI””MOBILE”と記載がありますが、NexusS(Android2.3.3)では上記の通りの実行結果でした。

実行時の画像は以下の通り。
左から、未接続、3G接続、Wifi接続状態の実行結果となります。