1. 程式人生 > >Android:TelephonyManager,MyPhoneStateListener監聽手機訊號強度

Android:TelephonyManager,MyPhoneStateListener監聽手機訊號強度

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import android.widget.Toast;

public class GetGsmSignalStrength extends Activity
{

	/*
	 * This variables need to be global, so we can used them onResume and
	 * onPause method to
	 * 
	 * stop the listener
	 */

	TelephonyManager Tel;

	MyPhoneStateListener MyListener;

	TextView tv;
	
	/** Called when the activity is first created. */

	@Override
	public void onCreate(Bundle savedInstanceState)

	{

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		
		tv = (TextView) findViewById(R.id.tv);
		/* Update the listener, and start it */

		MyListener = new MyPhoneStateListener();

		Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

		Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

	}

	/* Called when the application is minimized */

	@Override
	protected void onPause()

	{

		super.onPause();

		Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE);

	}

	/* Called when the application resumes */

	@Override
	protected void onResume()

	{

		super.onResume();

		Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

	}

	/* —————————– */

	/* Start the PhoneState listener */

	/* —————————– */

	private class MyPhoneStateListener extends PhoneStateListener

	{

		/*
		 * Get the Signal strength from the provider, each tiome there is an
		 * update 從得到的訊號強度,每個tiome供應商有更新
		 */
                  //這個方法只有在訊號強度改變時才呼叫,或者程式剛剛啟動時呼叫,如果想看到Toast的訊號強度提示,那就等訊號改變或者重啟程式 
		@Override
		public void onSignalStrengthsChanged(SignalStrength signalStrength)

		{
                          
			super.onSignalStrengthsChanged(signalStrength);

			Toast.makeText(getApplicationContext(),
					"Go to Firstdroid!!! GSM Cinr = "

					+ String.valueOf(signalStrength.getGsmSignalStrength()),
					Toast.LENGTH_SHORT).show();
			//signalStrength.getGsmSignalStrength()獲得的是asu值
			tv.setText(signalStrength.getGsmSignalStrength()+"");

		}


	};/* End of private Class */

}/* GetGsmSignalStrength */

記得要在AndroidManifest.xml檔案中新增許可權

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

檢視手機訊號強度數值 設定->關於手機->狀態資訊->訊號強度

在手機設定-關於手機-狀態,裡面我們可以看到訊號強度一項,為多少dbm和asu,那麼這個單位是什麼意思呢?

android定義了2種訊號單位:dBm(1毫瓦的分貝數)和asu(alone signal unit 獨立訊號單元)。

它們之間的關係是:dBm =-113+2*asu,這是google給android手機定義的特有訊號單位。

也就是說手機會顯示比如 -67(dBm),等等,那到底數值為多少訊號是差或者好呢?
首先先說,這個數值越大越好!-67dbm VS -90dbm ,前者訊號比後者好!

這裡還說一個小知識:中國移動的規範規定,手機接收電平>=(城市取-90dBm;鄉村取-94dBm)時,則滿足覆蓋要求,
也就是說此處無線訊號強度滿足覆蓋要求,即接受電平>=-90dBm,就可以滿足覆蓋要求
-67dBm要比-90dBm訊號要強20多個dB,那麼它在打電話接通成功率和通話過程中的話音質量都會好的多(當然也包括EDGE/GPRS上網的速度那些 )

最後,就是說說訊號強度和訊號格數的顯示的關係:
工程師就是根據接受電平數值進行訊號格數的劃分。講比較複雜的資料以訊號格數直觀地表達在我們眼前。
說到此,就不由得提一下,許多機油說在同一個地方有的手機又一格兩格訊號,有的手機沒有訊號,相信大家現在都明白了~
當然,這個除了電平數值進行訊號格數的劃分存在細小差別外,手機之間也會存在個體差異和電平接受能力的差別。

Bm表示功率的絕對值。這個值是負的。比如我的手機現在顯示的是-57dbm 28asu,這代表訊號是好是差呢,是多好呢?
      首先,這個數值越大越好!-67dbm VS -90dbm ,前者訊號比後者好!
      中國移動的規範規定,手機接收電平>=(城市取-90dBm;鄉村取-94dBm)時,則滿足覆蓋要求。也就是說-67dBm要比-90dBm信 號要強20多個dB,那麼它在打電話接通成功率和通話過程中的話音質量都會好的多(當然也包括EDGE/GPRS上網的速度那些 )。
      訊號強度和訊號格數的顯示的關係:工程師根據接受電平數值進行訊號格數的劃分,將比較複雜的資料以訊號格數直觀地表達在我們眼前。當然,不同廠家對電平數值進行訊號格數的劃分存在細小差別,手機之間也會存在個體差異和電平接受能力的差別。

簡單的說dBm值肯定是負數的,越接近0訊號就越好,但是不可能為0的。 ASU的值則相反,是正數,也是值越大越好。按規定,只要城市裡dbm大於-90,農村裡大於-94就是正常的,舉例說明就是:-81dBm的訊號比-90dBm的強,-67dBm的訊號比-71dBm的強 ,低於-113那就是沒訊號了。

關於dBm和ASU換算的關係是 dBm=-113+2*ASU

比如我們看到訊號為 -67dBm 23ASU的時候,他們的關係就是 -113+2*23ASU=-67dBm 反之就是 {-113-(-67dBm)}/2 =23ASU。

基於此,大家可以得出手機訊號強弱的對比,或者衡量刷radio後的效果等等吧。