前回、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)では上記の通りの実行結果でした。