android手机信号强度检测

android⼿机信号强度检测
android⼿机信号强度检测
最近在⾯试的时候被问到⼀个问题,当⼿机处于弱⽹状态下,如何处理,如何监听⽹络信号强度变化。
这⾥先了解关于⼿机信号强度的相关⼏个概念
⽂章出处:
Android⼿机信号强度介绍
android定义了2种信号单位:dBm和asu。它们之间的关系是:dBm =-113+2asu,这是google给android⼿机定义的特有信号单位。例如,我的信号强度为-53dBm,则对应30asu,因为-53 = -113 + (230) 。
详细介绍两者:
asu:alone signal unit 独⽴信号单元,是⼀种模拟信号。ASU仅仅代表⼿机将它的位置传递给附近的信号塔的速率。它和dBm 测量的是⼀样的东西,但是是以⼀种更加线性的⽅式来表⽰。
dBm:是⼀个表⽰功率绝对值的值(也可以认为是以1mW功率为基准的⼀个⽐值),计算公式为:10lo
g(功率值/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,即甲的功率⽐⼄的功率⼤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="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_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) {
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(view);
//获取telephonyManager
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        //开始监听
mListener = new PhoneStatListener();
//监听信号强度
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onResume() {
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onPause() {
诸病源候论
//⽤户不在当前页⾯时,停⽌监听
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_NONE);
}
private class PhoneStatListener extends PhoneStateListener {
//获取信号强度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
//获取⽹络信号强度
//获取0-4的5种信号级别,越⼤信号越好,但是api23开始才能⽤
//            int level = Level();
int gsmSignalStrength = GsmSignalStrength();
//获取⽹络类型
int netWorkType = getNetWorkType(MainActivity.this);
switch (netWorkType) {
case NETWORKTYPE_WIFI:
mTextView.setText("当前⽹络为wifi,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_2G:
mTextView.setText("当前⽹络为2G移动⽹络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_4G:
mTextView.setText("当前⽹络为4G移动⽹络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_NONE:
mTextView.setText("当前没有⽹络,信号强度为:" + gsmSignalStrength);
break;
case -1:
mTextView.setText("当前⽹络错误,信号强度为:" + gsmSignalStrength);
break;
}
}
}
public static int getNetWorkType(Context context) {
int mNetWorkType = -1;
int mNetWorkType = -1;
ConnectivityManager manager = (ConnectivityManager) SystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = ActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
String type = TypeName();
if (type.equalsIgnoreCase("WIFI")) {
mNetWorkType = NETWORKTYPE_WIFI;
} else if (type.equalsIgnoreCase("MOBILE")) {
return isFastMobileNetwork(context) ? NETWORKTYPE_4G : NETWORKTYPE_2G;
}
} else {
mNetWorkType = NETWORKTYPE_NONE;//没有⽹络
}
return mNetWorkType;
}
/**判断⽹络类型*/
private static boolean isFastMobileNetwork(Context context) {
TelephonyManager telephonyManager = (SystemService(Context.TELEPHONY_SERVICE);        if (NetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
//这⾥只简单区分两种类型⽹络,认为4G⽹络为快速,但最终还需要参考信号值
return true;
}
return false;
}
}
改进后的⽅式,wifi的信号通过wifimanager来监听,更精确,并且通过⼴播的⽅式更灵敏
package org.skxy.wwwworksingstrange;
t.BroadcastReceiver;
t.Context;
t.Intent;
t.IntentFilter;
import android.ConnectivityManager;
import android.NetworkInfo;
import android.wifi.WifiInfo;
import android.wifi.WifiManager;
import android.os.Bundle;
气刨碳棒
import android.support.v7.app.AppCompatActivity;
lephony.PhoneStateListener;
lephony.SignalStrength;
lephony.TelephonyManager;
import android.widget.TextView;
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;
public int mGsmSignalStrength;
private NetWorkBroadCastReciver mNetWorkBroadCastReciver;
奋进的旋律评价/**
* ⽹络信号强度监听
*
* @param savedInstanceState
*/
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(view);
//获取telephonyManager
mTelephonyManager = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
//开始监听
mListener = new PhoneStatListener();
/**由于信号值变化不⼤时,监听反应不灵敏,所以通过⼴播的⽅式同时监听wifi和信号改变更灵敏*/
mNetWorkBroadCastReciver = new NetWorkBroadCastReciver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
吹牛的由来intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
registerReceiver(mNetWorkBroadCastReciver, intentFilter);
}
@Override
protected void onResume() {
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS); }
@Override
protected void onPause() {
//⽤户不在当前页⾯时,停⽌监听
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_NONE);
}
private class PhoneStatListener extends PhoneStateListener {
//获取信号强度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
/
/获取⽹络信号强度
//获取0-4的5种信号级别,越⼤信号越好,但是api23开始才能⽤
//            int level = Level();
mGsmSignalStrength = GsmSignalStrength();
//⽹络信号改变时,获取⽹络信息片章
getNetWorkInfo();
}
}
/**暂时不⽤这个⽅法*/
public int getNetWorkType(Context context) {
int mNetWorkType = -1;
ConnectivityManager manager = (ConnectivityManager)
NetworkInfo networkInfo = ActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
String type = TypeName();
if (type.equalsIgnoreCase("WIFI")) {
mNetWorkType = NETWORKTYPE_WIFI;
} else if (type.equalsIgnoreCase("MOBILE")) {
return isFastMobileNetwork() ? NETWORKTYPE_4G : NETWORKTYPE_2G;
}
} else {
mNetWorkType = NETWORKTYPE_NONE;//没有⽹络

本文发布于:2024-09-22 17:21:47,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/250561.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:信号   信号强度   监听   功率   类型   单位   记得
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议