先贴上代码:亲测在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卡值的方法。
网上大多数都是使用