Android获取移动网络信号强度

作者: lebronzhen | 来源:发表于2020-11-25 18:13 被阅读0次
    判断有没有SIM卡

    获取移动网络的信号,一定要判断是否插了SIM卡,没插卡肯定是没法获取的

        /**
         * 判断是否包含SIM卡
         *
         * @return 状态
         */
        public static boolean hasSimCard(Context context) {
            TelephonyManager telMgr = (TelephonyManager)
                    context.getSystemService(Context.TELEPHONY_SERVICE);
            int simState = telMgr.getSimState();
            boolean result = true;
            switch (simState) {
                case TelephonyManager.SIM_STATE_ABSENT:
                case TelephonyManager.SIM_STATE_UNKNOWN:
                    result = false; // 没有SIM卡
                    break;
            }
            return result;
        }
    
    获取信号强度

    如果插了SIM卡,就可以通过下边方法来获取移动网络的信号强度(单位dBM),使用的是TelephonyManager 来监听

        private void getMobileNetworkSignal() {
            if (!PhoneUtils.hasSimCard(mcontext)) {
                logger.info("getMobileNetworkSignal: no sim card");
                return;
            }
            TelephonyManager mTelephonyManager = (TelephonyManager) BaseApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
            if (mTelephonyManager != null) {
                mTelephonyManager.listen(new PhoneStateListener() {
    
                    @Override
                    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                        super.onSignalStrengthsChanged(signalStrength);
                        int asu = signalStrength.getGsmSignalStrength();
                        int lastSignal = -113 + 2 * asu;
                        if (lastSignal > 0) {
                            mobileNetworkSignal = lastSignal + "dBm";
                        }
                        logger.info("Current mobileNetworkSignal:" + lastSignal + " dBm");
                    }
                }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
            }
        }
    

    也可以添加网络类型的判断,来获取是何种网络的信号强度

    int netWorkType = getNetWorkType(mContext);
    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;
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            String type = networkInfo.getTypeName();
            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 = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
            return true;
        }
        return false;
    }
    

    最后添加必要权限即可

    <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"/>
    

    相关文章

      网友评论

        本文标题:Android获取移动网络信号强度

        本文链接:https://www.haomeiwen.com/subject/ubwniktx.html