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文件中添加权限

 

查看手机信号强度数值 设置->关于手机->状态信息->信号强度

 

在手机设置-关于手机-状态,里面我们可以看到信号强度一项,为多少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后的效果等等吧。



 

你可能感兴趣的:(Android:TelephonyManager,MyPhoneStateListener监听手机信号强度)