Androidでネットワーク状態を知る

タグ: | 投稿日: 投稿者:

takeです。

弊社の動画配信サービスをAndroidで利用する際、現在のネットワーク状態により
配信する動画のビットレートを決定していたのですが。。。

当初のアプリ配信時には、ネットワーク状態は3GとWifiしかなくてWifiなら高ビットレート、
3Gなら低ビットレートを選択みたいな事をアプリからやってました。
が、時代の流れとは早いもので昨今ではWiMAX(+WiMAX)やらLTEやら新しいネットワークが増えてきました。

ユーザにとっては回線速度があがってとってもありがたい話しなんですが、開発者にとっては
たまったもんじゃありません(汗
上記のように3GとWifiのみで判定していると、プログラムの組み方によっては高速回線であるはずの
WiMAXやLTEが『3G』と判断されて画質の悪い低ビットレートの動画が配信されてしまいます。

この状態を回避する為に、正しいネットワーク状態を取得してみましょう。

まず、ネットワーク情報を取得する為、AndroidManifest.xml に以下のコードを記述します。

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

これでネットワーク状態を取得する準備ができました。

次は、取得メソッドです。

public enum NetworkStatus {
   OFF,
   MOBILE,
   WIFI,
   WIMAX,
   LTE,
}

public NetworkStatus getConnectedState(Context context) {

	ConnectivityManager manager = (ConnectivityManager)context.getSystemService(CONNECTIVITY_SERVICE);
	NetworkStatus status = NetworkStatus.OFF;

	NetworkInfo info = manager.getActiveNetworkInfo();
	if (info == null || info.isConnected() != true) {
		// OFF
		return status;
	}

	switch (info.getType()) {
	case ConnectivityManager.TYPE_WIFI:			// Wifi
		status = NetworkStatus.WIFI;
		break;
	case ConnectivityManager.TYPE_MOBILE_DUN:	// Mobile 3G
	case ConnectivityManager.TYPE_MOBILE_HIPRI:
	case ConnectivityManager.TYPE_MOBILE_MMS:
	case ConnectivityManager.TYPE_MOBILE_SUPL:
	case ConnectivityManager.TYPE_MOBILE:
		switch (info.getSubtype()) {
		case TelephonyManager.NETWORK_TYPE_LTE:
			status = NetworkStatus.LTE;			// LTE
			break;
		default:
			status = NetworkStatus.MOBILE;		// Mobile 3G
			break;
		}
		break;
	case ConnectivityManager.TYPE_WIMAX:		// Wimax
		status = NetworkStatus.WIMAX;
		break;
	}
	return status;
}

一応これで取得できるはずなんですが、LTEを判定できるのは API Level 11(Android3.0) からなんです。
Galaxy S II LTE SC-03D みたいな Android2.3なのにLTE搭載機は正常に判定できるかわかりません。

では。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook