Android 获取SIM卡信号强度(dbm)包括wifi信号强度

先贴上代码:亲测在Android5.1主板可用
解释在后面看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class WIFIManager {

    public static String TAG = "WIFIManager";
    private static Context context;
    public static TelephonyManager telephonyManager = null;
    public static int mRssi4G = 25;
    private static Handler handler = new Handler();

    public static void init(Context count) {
        context = count;
        telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        int simState = telephonyManager.getSimState();
        Logger.i(TAG, "当前的SIM卡状态:" + simState);
        switch (simState) {
            case TelephonyManager.SIM_STATE_ABSENT://无sim卡
                handler.postDelayed(new WifiRunnble(), 10000);
                break;
            case TelephonyManager.SIM_STATE_NETWORK_LOCKED://无需NetWorkPIN解锁
                handler.postDelayed(new WifiRunnble(), 10000);
                break;
            case TelephonyManager.SIM_STATE_PIN_REQUIRED://需要PIN解锁
                handler.postDelayed(new WifiRunnble(), 10000);
                break;
            case TelephonyManager.SIM_STATE_PUK_REQUIRED://需要PUK解锁
                handler.postDelayed(new WifiRunnble(), 10000);
                break;
            case TelephonyManager.SIM_STATE_READY://良好
                getDataNetworkRssi();
                break;
            case TelephonyManager.SIM_STATE_UNKNOWN://未知状态
                handler.postDelayed(new WifiRunnble(), 10000);
                getWifiRssi();
                break;
        }
    }

    /**
     * 定时获取信号强度
     */
    static class WifiRunnble implements Runnable {
        @Override
        public void run() {
            getWifiRssi();
            handler.postDelayed(this, 20 * 1000);//10秒获取一次WIFI的信号强度
        }
    }

    /**
     * 获取数据网络信号强度
     */
    public static void getDataNetworkRssi() {
        if (telephonyManager != null) {
            final int type = telephonyManager.getNetworkType();//获取网络类型联通3g,移动3g,电信3g...
            PhoneStateListener phoneStateListener = new PhoneStateListener() {
                @Override
                public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                    super.onSignalStrengthsChanged(signalStrength);
                    String s = signalStrength.toString();//获取到的信号强度数据是以空格分开的
                    String[] split = s.split("\\s+");
                    int strength = 0;
                    int i=0;
                    for (String a : split){
                        i++;
                        if(i == 10){
                            //当获取到信号强度数据的第10个值的时候为信号强度值,自己可将每个值都打印出来看看
                            strength = Integer.parseInt(a);
                        }
                    }
                    mRssi4G = strength == mRssi4G ? mRssi4G : strength;
                    Logger.e(TAG, "当前网络类型:" + type + ",信号强度:" + strength + "dBm");
                }
            };
            telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);//监听网络信号事件
        }
    }

    /**
     * 获取当前wifi信号强度(-50~0:信号较好,-70~-50:信号较差,-100~-50:信号最差)
     */
    public static void getWifiRssi() {
        @SuppressLint("WifiManagerLeak") WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
        @SuppressLint("MissingPermission") WifiInfo info = wifiManager.getConnectionInfo();
        mRssi4G = info.getRssi();
        Log.e(TAG, "wifi信号强度:" + mRssi4G);
    }
}

使用方法:
在设置的全局变量类里面或者任意一个Activity中写入:
全局变量设置可参考:
全局变量设置链接

1
WIFIManager.init(context);

以上代码是公司离职一名码农写的,自己经过修改完成的。

之前写的项目里面获取SIM卡信号强度值一直不变,后来查阅资料发现网上很多都是错误的方法,经过查询发现Google好像并没有直接获取SIM卡值的方法。
网上大多数都是使用signalStrength.get....来获取,经过此方法获取到的数值都不对,保持不变,后来发现signalStrength.toString()返回的字符串有信号值,自己就写了一个for循环来获取这个SIM信号值,获取到的信号值与手机设置里面信号值一样。