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手机信号强度检测详细介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!