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が必要となります。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
●ConnectivityManagerの取得
ConnectivityManagerをSystemServerから取得します。
※マニフェストファイルへのPermissionの付与を忘るとエラーで落ちます。
取得方法は、Activity#getSystemService() に CONNECTIVITY_SERVICEを渡すことで取得します。
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
●NetworkInfoクラスの使用
NetworkInfo#isConnectedを使用することで、ネットワークの接続状態を true/false で取得することができます。
NetworkInfoクラスでは他に、現在のネットワーク状態の詳細(CONNECTING、CONNECTED、SCANNINGなど)をENUM値で保持している、NetworkInfo.State型やNetworkInfo.DetailedState 型のステータスを取得したりもすることができます。
最後に、NetworkInfoクラスの使用方法とともに、作成したサンプルアプリのソースを貼り付けます。
作成したアプリケーションでは、ボタン押下時に、ネットワークの状態を取得し、画像を変更しています。
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接続状態の実行結果となります。