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文件中添加权限
查看手机信号强度数值 设置->关于手机->状态信息->信号强度
在手机设置-关于手机-状态,里面我们可以看到信号强度一项,为多少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后的效果等等吧。