Android手机信号强度检测详细介绍
最近到处在跑着找工作,难免在面试过程中遇到这样那样的问题,记得最清楚一次在面试过程中被问到,当手机处于弱网状态下,如何处理,如何监听网络信号强度变化。但是真是蒙了,回答的乱七八糟,思路一点都不明确。今天小编在这里带领大家了解下关于手机信号强度的相关几个概念。
Android手机信号强度介绍
android定义了2种信号单位:dBm和asu。它们之间的关系是:dBm=-113+2asu,这是google给android手机定义的特有信号单位。例如,我的信号强度为-53dBm,则对应30asu,因为-53=-113+(230)。
详细介绍两者:
asu:alonesignalunit独立信号单元,是一种模拟信号。ASU仅仅代表手机将它的位置传递给附近的信号塔的速率。它和dBm测量的是一样的东西,但是是以一种更加线性的方式来表示。
dBm:是一个表示功率绝对值的值(也可以认为是以1mW功率为基准的一个比值),计算公式为:10log(功率值/1mw)。
[例]如果功率P为1mw,折算为dBm后为0dBm。
[例]对于0.01mW的功率,按dBm单位进行折算后的值应为:10log(0.01/1)=-20dBm。
这个数值越大,表明信号越好。由于手机信号强度一般较小,折算成为dBm一般都是负数。
中国移动的规范规定,手机接收电平>=(城市取-90dBm;乡村取-94dBm)时,则满足覆盖要求,
也就是说此处无线信号强度满足覆盖要求.-67dBm要比-90dBm信号要强20多个dB,
那么它在打电话接通成功率和通话过程中的话音质量都会好的多。再引入一个相关概念dB。
dB:是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压比计算,要用20log(甲电压/乙电压)。
[例]甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB,即甲的功率比乙的功率大3dB。反之,如果甲的功率是乙的功率的一半,则甲的功率比乙的功率小3dB。
总结:dBm是负数,越接近0信号强度越高,信号越好,但不可能为0。asu为正数,值越大信号越好。dB是两个量之间的比值,表示两个量间的相对大小,而dBm则是表示功率绝对大小的值。
关于对数运算,不记得的自行复习一下了。
下面再来了解一下网络类型吧,还是很多的,不过在国内只要了解国内三大运营商的网络类型大概就可以了。
电信
2GCDMA
3GCDMA2000
4GTD-LTE,FDD-LTE
移动
2GGSM
3GTD-SCDMA
4GTD-LTE,FDD-LTE
联通
2GGSM
3GWCDMA
4GTD-LTE,FDD-LTE
而谷歌API给我们提供的有19种类型,在TelephonyManager类中定义,具体如下
/**Networktypeisunknown*/ publicstaticfinalintNETWORK_TYPE_UNKNOWN=0; /**CurrentnetworkisGPRS*/ publicstaticfinalintNETWORK_TYPE_GPRS=1; /**CurrentnetworkisEDGE*/ publicstaticfinalintNETWORK_TYPE_EDGE=2; /**CurrentnetworkisUMTS*/ publicstaticfinalintNETWORK_TYPE_UMTS=3; /**CurrentnetworkisCDMA:EitherIS95AorIS95B*/ publicstaticfinalintNETWORK_TYPE_CDMA=4; /**CurrentnetworkisEVDOrevision0*/ publicstaticfinalintNETWORK_TYPE_EVDO_0=5; /**CurrentnetworkisEVDOrevisionA*/ publicstaticfinalintNETWORK_TYPE_EVDO_A=6; /**Currentnetworkis1xRTT*/ publicstaticfinalintNETWORK_TYPE_1xRTT=7; /**CurrentnetworkisHSDPA*/ publicstaticfinalintNETWORK_TYPE_HSDPA=8; /**CurrentnetworkisHSUPA*/ publicstaticfinalintNETWORK_TYPE_HSUPA=9; /**CurrentnetworkisHSPA*/ publicstaticfinalintNETWORK_TYPE_HSPA=10; /**CurrentnetworkisiDen*/ publicstaticfinalintNETWORK_TYPE_IDEN=11; /**CurrentnetworkisEVDOrevisionB*/ publicstaticfinalintNETWORK_TYPE_EVDO_B=12; /**CurrentnetworkisLTE*/ publicstaticfinalintNETWORK_TYPE_LTE=13; /**CurrentnetworkiseHRPD*/ publicstaticfinalintNETWORK_TYPE_EHRPD=14; /**CurrentnetworkisHSPA+*/ publicstaticfinalintNETWORK_TYPE_HSPAP=15; /**CurrentnetworkisGSM{@hide}*/ publicstaticfinalintNETWORK_TYPE_GSM=16; /**CurrentnetworkisTD_SCDMA{@hide}*/ publicstaticfinalintNETWORK_TYPE_TD_SCDMA=17; /**CurrentnetworkisIWLAN{@hide}*/ publicstaticfinalintNETWORK_TYPE_IWLAN=18;
下面通过一些实例来测试一下吧
首先记得加权限
<uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
实例代码
publicclassMainActivityextendsAppCompatActivity{ privatestaticfinalintNETWORKTYPE_WIFI=0; privatestaticfinalintNETWORKTYPE_4G=1; privatestaticfinalintNETWORKTYPE_2G=2; privatestaticfinalintNETWORKTYPE_NONE=3; publicTextViewmTextView; publicTelephonyManagermTelephonyManager; publicPhoneStatListenermListener; /** *网络信号强度监听 * *@paramsavedInstanceState */ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.textview); //获取telephonyManager mTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); //开始监听 mListener=newPhoneStatListener(); //监听信号强度 mTelephonyManager.listen(mListener,PhoneStatListener.LISTEN_SIGNAL_STRENGTHS); } @Override protectedvoidonResume(){ super.onResume(); mTelephonyManager.listen(mListener,PhoneStatListener.LISTEN_SIGNAL_STRENGTHS); } @Override protectedvoidonPause(){ super.onPause(); //用户不在当前页面时,停止监听 mTelephonyManager.listen(mListener,PhoneStatListener.LISTEN_NONE); } privateclassPhoneStatListenerextendsPhoneStateListener{ //获取信号强度 @Override publicvoidonSignalStrengthsChanged(SignalStrengthsignalStrength){ super.onSignalStrengthsChanged(signalStrength); //获取网络信号强度 //获取0-4的5种信号级别,越大信号越好,但是api23开始才能用 //intlevel=signalStrength.getLevel(); intgsmSignalStrength=signalStrength.getGsmSignalStrength(); //获取网络类型 intnetWorkType=getNetWorkType(MainActivity.this); switch(netWorkType){ caseNETWORKTYPE_WIFI: mTextView.setText("当前网络为wifi,信号强度为:"+gsmSignalStrength); break; caseNETWORKTYPE_2G: mTextView.setText("当前网络为2G移动网络,信号强度为:"+gsmSignalStrength); break; caseNETWORKTYPE_4G: mTextView.setText("当前网络为4G移动网络,信号强度为:"+gsmSignalStrength); break; caseNETWORKTYPE_NONE: mTextView.setText("当前没有网络,信号强度为:"+gsmSignalStrength); break; case-1: mTextView.setText("当前网络错误,信号强度为:"+gsmSignalStrength); break; } } } publicstaticintgetNetWorkType(Contextcontext){ intmNetWorkType=-1; ConnectivityManagermanager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfonetworkInfo=manager.getActiveNetworkInfo(); if(networkInfo!=null&&networkInfo.isConnected()){ Stringtype=networkInfo.getTypeName(); if(type.equalsIgnoreCase("WIFI")){ mNetWorkType=NETWORKTYPE_WIFI; }elseif(type.equalsIgnoreCase("MOBILE")){ returnisFastMobileNetwork(context)?NETWORKTYPE_4G:NETWORKTYPE_2G; } }else{ mNetWorkType=NETWORKTYPE_NONE;//没有网络 } returnmNetWorkType; } /**判断网络类型*/ privatestaticbooleanisFastMobileNetwork(Contextcontext){ TelephonyManagertelephonyManager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if(telephonyManager.getNetworkType()==TelephonyManager.NETWORK_TYPE_LTE){ //这里只简单区分两种类型网络,认为4G网络为快速,但最终还需要参考信号值 returntrue; } returnfalse; } }
关于信号获取流程,这个还需深入研究,目前只在应用层简单获取了网络信号。
以上所述是小编给大家介绍的Android手机信号强度检测详细介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!