Android:TelephonyManager,MyPhoneStateListener监听手机信号强度

来源:互联网 发布:淘宝网ie8不能使用 编辑:程序博客网 时间:2024/04/30 05:54
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. */@Overridepublic 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 */@Overrideprotected void onPause(){super.onPause();Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE);}/* Called when the application resumes */@Overrideprotected 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的信号强度提示,那就等信号改变或者重启程序 @Overridepublic 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后的效果等等吧。



 

原创粉丝点击