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接続状態の実行結果となります。