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後的效果等等吧。