作者:skxy 字体:[增加 减小] 类型:转载 时间:2016-11-17 我要评论
这篇文章主要介绍了Android手机信号强度检测的相关资料,android定义了2种信号单位:dBm和asu。具体两种的关系本文给大家介绍非常详细,需要的朋友可以参考下
最近到处在跑着找工作,难免在面试过程中遇到这样那样的问题,记得最清楚一次在面试过程中被问到,当手机处于弱网状态下,如何处理,如何监听网络信号强度变化。但是真是蒙了,回答的乱七八糟,思路一点都不明确。今天小编在这里带领大家了解下关于手机信号强度的相关几个概念。
Android手机信号强度介绍
android定义了2种信号单位:dBm和asu。它们之间的关系是:dBm =-113+2asu,这是google给android手机定义的特有信号单位。例如,我的信号强度为-53dBm,则对应30asu,因为-53 = -113 + (230) 。
详细介绍两者:
asu:alone signal unit 独立信号单元,是一种模拟信号。ASU仅仅代表手机将它的位置传递给附近的信号塔的速率。它和dBm测量的是一样的东西,但是是以一种更加线性的方式来表示。
dBm:是一个表示功率绝对值的值(也可以认为是以1mW功率为基准的一个比值),计算公式为:10log(功率值/1mw)。
[例] 如果功率P为1mw,折算为dBm后为0dBm。
[例] 对于001mW的功率,按dBm单位进行折算后的值应为: 10log(001/1)=-20dBm。
这个数值越大,表明信号越好。由于手机信号强度一般较小,折算成为dBm一般都是负数。
中国移动的规范规定,手机接收电平>=(城市取-90dBm;乡村取-94dBm) 时,则满足覆盖要求,
也就是说此处无线信号强度满足覆盖要求-67dBm要比-90dBm信号要强20多个dB,
那么它在打电话接通成功率和通话过程中的话音质量都会好的多。再引入一个相关概念dB。
dB:是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压 比计算,要用20log(甲电压/乙电压)。
[例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB,即甲的功率比乙的功率大3 dB。反之,如果甲的功率是乙的功率的一半,则甲的功率比乙的功率小3 dB。
总结:dBm是负数,越接近0信号强度越高,信号越好,但不可能为0。asu为正数,值越大信号越好。dB是两个量之间的比值,表示两个量间的相对大小,而dBm则是表示功率绝对大小的值。
关于对数运算,不记得的自行复习一下了。
下面再来了解一下网络类型吧,还是很多的,不过在国内只要了解国内三大运营商的网络类型大概就可以了。
电信
2G CDMA
3G CDMA2000
4G TD-LTE,FDD-LTE
移动
2G GSM
3G TD-SCDMA
4G TD-LTE,FDD-LTE
联通
2G GSM
3G WCDMA
4G TD-LTE,FDD-LTE
而谷歌API给我们提供的有19种类型,在TelephonyManager类中定义,具体如下
/ Network type is unknown /
public static final int NETWORK_TYPE_UNKNOWN = 0;
/ Current network is GPRS /
public static final int NETWORK_TYPE_GPRS = 1;
/ Current network is EDGE /
public static final int NETWORK_TYPE_EDGE = 2;
/ Current network is UMTS /
public static final int NETWORK_TYPE_UMTS = 3;
/ Current network is CDMA: Either IS95A or IS95B/
public static final int NETWORK_TYPE_CDMA = 4;
/ Current network is EVDO revision 0/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/ Current network is EVDO revision A/
public static final int NETWORK_TYPE_EVDO_A = 6;
/ Current network is 1xRTT/
public static final int NETWORK_TYPE_1xRTT = 7;
/ Current network is HSDPA /
public static final int NETWORK_TYPE_HSDPA = 8;
/ Current network is HSUPA /
public static final int NETWORK_TYPE_HSUPA = 9;
/ Current network is HSPA /
public static final int NETWORK_TYPE_HSPA = 10;
/ Current network is iDen /
public static final int NETWORK_TYPE_IDEN = 11;
/ Current network is EVDO revision B/
public static final int NETWORK_TYPE_EVDO_B = 12;
/ Current network is LTE /
public static final int NETWORK_TYPE_LTE = 13;
/ Current network is eHRPD /
public static final int NETWORK_TYPE_EHRPD = 14;
/ Current network is HSPA+ /
public static final int NETWORK_TYPE_HSPAP = 15;
/ Current network is GSM {@hide} /
public static final int NETWORK_TYPE_GSM = 16;
/ Current network is TD_SCDMA {@hide} /
public static final int NETWORK_TYPE_TD_SCDMA = 17;
/ Current network is IWLAN {@hide} /
public static final int NETWORK_TYPE_IWLAN = 18;
下面通过一些实例来测试一下吧
首先记得加权限
<uses-permission android:name="androidpermissionINTERNET"/>
<uses-permission android:name="androidpermissionCHANGE_NETWORK_STATE"/>
<uses-permission android:name="androidpermissionACCESS_WIFI_STATE"/>
<uses-permission android:name="androidpermissionACCESS_NETWORK_STATE"/>
实例代码
public class MainActivity extends AppCompatActivity {
private static final int NETWORKTYPE_WIFI = 0;
private static final int NETWORKTYPE_4G = 1;
private static final int NETWORKTYPE_2G = 2;
private static final int NETWORKTYPE_NONE = 3;
public TextView mTextView;
public TelephonyManager mTelephonyManager;
public PhoneStatListener mListener;
/
网络信号强度监听
@param savedInstanceState
/
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
mTextView = (TextView) findViewById(Ridtextview);
//获取telephonyManager
mTelephonyManager = (TelephonyManager) getSystemService(ContextTELEPHONY_SERVICE);
//开始监听
mListener = new PhoneStatListener();
//监听信号强度
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onResume() {
superonResume();
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onPause() {
superonPause();
//用户不在当前页面时,停止监听
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_NONE);
}
private class PhoneStatListener extends PhoneStateListener {
//获取信号强度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
superonSignalStrengthsChanged(signalStrength);
//获取网络信号强度
//获取0-4的5种信号级别,越大信号越好,但是api23开始才能用
// int level = signalStrengthgetLevel();
int gsmSignalStrength = signalStrengthgetGsmSignalStrength();
//获取网络类型
int netWorkType = getNetWorkType(MainActivitythis);
switch (netWorkType) {
case NETWORKTYPE_WIFI:
mTextViewsetText("当前网络为wifi,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_2G:
mTextViewsetText("当前网络为2G移动网络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_4G:
mTextViewsetText("当前网络为4G移动网络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_NONE:
mTextViewsetText("当前没有网络,信号强度为:" + gsmSignalStrength);
break;
case -1:
mTextViewsetText("当前网络错误,信号强度为:" + gsmSignalStrength);
break;
}
}
}
public static int getNetWorkType(Context context) {
int mNetWorkType = -1;
ConnectivityManager manager = (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo networkInfo = managergetActiveNetworkInfo();
if (networkInfo != null && networkInfoisConnected()) {
String type = networkInfogetTypeName();
if (typeequalsIgnoreCase("WIFI")) {
mNetWorkType = NETWORKTYPE_WIFI;
} else if (typeequalsIgnoreCase("MOBILE")) {
return isFastMobileNetwork(context) NETWORKTYPE_4G : NETWORKTYPE_2G;
}
} else {
mNetWorkType = NETWORKTYPE_NONE;//没有网络
}
return mNetWorkType;
}
/判断网络类型/
private static boolean isFastMobileNetwork(Context context) {
TelephonyManager telephonyManager = (TelephonyManager)contextgetSystemService(ContextTELEPHONY_SERVICE);
if (telephonyManagergetNetworkType() == TelephonyManagerNETWORK_TYPE_LTE) {
//这里只简单区分两种类型网络,认为4G网络为快速,但最终还需要参考信号值
return true;
}
return false;
}
}
关于信号获取流程,这个还需深入研究,目前只在应用层简单获取了网络信号。
果断是坑你的钱啊。下面是解决办法1进入手机系统设置----无线和网络----WIFI设置---菜单键----高级-----在下方IP设置里勾选“使用静态IP”2在“使用静态IP地址”下方,对应填写:IP地址:192168121(这个最后一位数可以随意改,范围0~255,如192168174)网关:19216811(注意了,这里是你路由器的网关,这里是默认的地址)网络掩码:2552552550(分为三种,详细看电脑里的)域名1:19216811(一般和上面的网关地址保持一致,直接上网的得修改为网络网关地址)域名2:不填写(特殊情况填写)3保存!之后你会发现你的WIFI掉线后自动重新连接上了,之后不必再重启路由,不会一直出现“正在获取IP地址”的提示了
Android通过OK>public class NetUtils{
public static boolean isNetworkConnected(Context context){
ConnectivityManager mConnectivityManager = (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo[] infos = cmgetAllNetworkInfo();
for(NetworkInfo info:infos){
if(infoisAvailable()&&infoisConnected()){
return true;
}
}
return false;
}
}
NetworkInfo的isAvailable()和isConnected()有以下5种状态:
在WLAN设置界面
1,显示连接已保存,但标题栏没有,即没有实质连接上:isConnected()==false,isAvailable()=true
2,显示连接已保存,标题栏也有已连接上的图标:isConnected()==true,isAvailable()=true
3,选择不保存后:isConnected()==false,isAvailable()=true
4,选择连接,在正在获取IP地址时:isConnected()==false,isAvailable()=false
5,连接上后:isConnected()==true,isAvailable()=true
①简单的异步Get请求
第一步,创建OK>
以上就是关于如何获得在Android的LTE信号的强度全部的内容,包括:如何获得在Android的LTE信号的强度、安卓m获取wifi列表为什么需要打开位置服务、Android系列之如何判断网络链接状态等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)