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