AndroidのTelephonyManagerで取得できる電界強度とアンテナマークの関係

携帯のアンテナ状態(電界強度)をアプリで取得する事ができます。
自作のアプリ無いでアンテナマーク的なものを表示したい場合の情報として使うのですが、取得した結果アンテナ何本にしていいかがさっぱりわかりませんでした。
なので調べてみました。

情報の取得は「TelephonyManager」を使用して「PhoneStateListener.LISTEN_SIGNAL_STRENGTHS」をインテントレシーバーで受けて、「SignalStrength」で詳細情報を調べます。


アイコンサンプル
 
 ※左の番号と表のiconの番号が対応しています。


アイコンと値の対応表
 cdmaとEvoは2種類の値が取得できるので計算した結果からIconの番号が小さい方を採用します。
 API Levelが8になる時にGSMのアイコンの表示閾値が変更になっています。
 この閾値はソースにハードコーディングされているので動的な取得はムリだと思います。
 メーカーのカスタマイズで変更されたらもうさっぱりですね。
 


電界強度の情報の取得方法
 念のためサンプル

	private TelephonyManager _telephonyManager = null;

	public TelephonyManager getTelephonyManager() {
		if(_telephonyManager == null){
			_telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
		}
		return _telephonyManager;
	}

	@Override
	public void onResume() {
		super.onResume();
		
		//リスナー登録
		getTelephonyManager().listen(_phoneStateListener,
				PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
		);
		
	}

	@Override
	public void onPause() {
		super.onPause();
		
		//リスナー解除
		getTelephonyManager().listen(_phoneStateListener, PhoneStateListener.LISTEN_NONE);
	}

	//情報を取得するインテントレシーバー
	private PhoneStateListener _phoneStateListener = new PhoneStateListener(){
		public void onSignalStrengthsChanged(android.telephony.SignalStrength signalStrength) {
		//ここで情報取得
		};
	};