美文网首页
Android 11可用的 3G 4G 5G,网络类型判断

Android 11可用的 3G 4G 5G,网络类型判断

作者: yunhen | 来源:发表于2021-02-01 19:25 被阅读0次

    x度找的,测试啦一下,可以用,然后记录一下,低版本的网上全都是,就不贴啦.
    要注意有2个权限,ACCESS_NETWORK_STATE:网络变化 ; READ_PHONE_STATE:信号类型(4g,3g),没有权限是得不到想要的结果,会一直得到0

    /**
         * Android10监听网络变化广播
        * updateState 更新view用的函数,注意里面要在主线程使用
         */
        ConnectivityManager.NetworkCallback mNetworkCallback = null;
        // 注册回调
        private void registerNetworkCallback(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
                if (mNetworkCallback == null)
                mNetworkCallback = new ConnectivityManager.NetworkCallback() {
                    // 可用网络接入
                    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                        L.d(TAG,"ConnectivityManager onCapabilitiesChanged ");
                        // 一般在此处获取网络类型然后判断网络类型,就知道时哪个网络可以用connected
                        if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){//WIFI
                            updateState(true,network,networkCapabilities);
                        }else if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){//移动数据
                            updateState(true,network,networkCapabilities);
                        }else {
                            updateState(false);
                        }
                    }
    
                    // 网络断开
                    public void onLost(Network network) {
                        L.d(TAG,"ConnectivityManager onLost ");
                        // 如果通过ConnectivityManager#getActiveNetwork()返回null,表示当前已经没有其他可用网络了。
                        updateState(false);
                    }
                };
    
                NetworkRequest.Builder builder = new NetworkRequest.Builder();
                builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
                builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
                if (mNetworkCallback!=null)
                    cm.registerNetworkCallback(builder.build(), mNetworkCallback);
            }
    
        }
    
        // 注销回调
        private void unregisterNetworkCallback(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if (mNetworkCallback != null) {
                    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
                    cm.unregisterNetworkCallback(mNetworkCallback);
                }
            }
        }
    
    /**
         * 枚举网络状态 NET_NO:没有网络 NET_2G:2g网络 NET_3G:3g网络 NET_4G:4g网络 NET_WIFI:wifi
         * NET_UNKNOWN:未知网络
         */
       public class NetState {
            public static final int NET_NO_CONNECT = 0;
            public static final int NET_WIFI = 1;
            public static final int NET_2G = 2;
            public static final int NET_3G = 3;
            public static final int NET_4G = 4;
            public static final int NET_5G = 5;
            public static final int NET_UNKNOWN = -1;
            /**
             * 没有READ_PHONE_STATE 权限,不过是可以知道当前是 移动网络,不是wifi
             */
            public static final int NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS = -2;
            public static final int NOT_PERMISSION_ACCESS_NETWORK_STATE = -3;
        }
    
        @IntDef({NetState.NET_NO_CONNECT, NetState.NET_2G, NetState.NET_3G, NetState.NET_4G, NetState.NET_5G
                , NetState.NET_UNKNOWN, NetState.NET_WIFI
        ,NetState.NOT_PERMISSION_ACCESS_NETWORK_STATE,NetState.NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS})
        public @interface NetStateInt {
    
        }
    
    /**
         * 判断当前网络连接
         * android N 以上用 NetworkCapabilities 和 TelephonyManager.getDataNetworkType()
         *
         *  {ACCESS_NETWORK_STATE (必须) , READ_PHONE_STATE (可无,有的话可以判断是 3g/4g)}
         * @param context 上下文
         * @return 状态码 @NetStateInt
         */
       public static @NetStateInt int getNetType(Context context,Network network
                ,NetworkCapabilities netCapabilities) {
            int stateCode = NetState.NET_UNKNOWN;
    
            final String tag_ = "getNetType";
    //            ACCESS_NETWORK_STATE
            if (!FucUtil.checkPermission(context
                    , new String[]{Manifest.permission.ACCESS_NETWORK_STATE})) {
                L.d(tag_,"checkPermission  ACCESS_NETWORK_STATE");
                return NetState.NOT_PERMISSION_ACCESS_NETWORK_STATE;
            }
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
    
            if (SdkCheck.isAndroid7()) {
    
                Network ni = network;
                if (ni == null) {
                    L.d(tag_,"Network is null");
                    return NetState.NET_NO_CONNECT;
                }
                NetworkCapabilities capabilities = netCapabilities;
    
                if (capabilities == null) {
                    L.d(tag_,"NetworkCapabilities is null");
                    return NetState.NET_NO_CONNECT;
                }
    
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    stateCode = NetState.NET_WIFI;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    if (!FucUtil.checkPermission(context
                            , new String[]{Manifest.permission.READ_PHONE_STATE})) {
                        return NetState.NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS;
                    }
                    TelephonyManager tm = (TelephonyManager) context
                            .getSystemService(Context.TELEPHONY_SERVICE);
                    // READ_PHONE_STATE
                    int type = tm.getDataNetworkType();
                    if (type == TelephonyManager.NETWORK_TYPE_UNKNOWN){
                        return NetState.NET_UNKNOWN;
                    }
    //                boolean hasCarr = tm.hasCarrierPrivileges();
                    L.d(tag_,"getNetworkType type  =="+type);
    //                L.d(tag_,"hasCarrierPrivileges  =="+hasCarr);
                    switch (type) {
    
                        case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
                        case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
                        case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
                        case TelephonyManager.NETWORK_TYPE_1xRTT:
                        case TelephonyManager.NETWORK_TYPE_IDEN:
                            stateCode = NetState.NET_2G;
                            break;
                        case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
                        case TelephonyManager.NETWORK_TYPE_UMTS:
                        case TelephonyManager.NETWORK_TYPE_EVDO_0:
                        case TelephonyManager.NETWORK_TYPE_HSDPA:
                        case TelephonyManager.NETWORK_TYPE_HSUPA:
                        case TelephonyManager.NETWORK_TYPE_HSPA:
                        case TelephonyManager.NETWORK_TYPE_EVDO_B:
                        case TelephonyManager.NETWORK_TYPE_EHRPD:
                        case TelephonyManager.NETWORK_TYPE_HSPAP:
                            stateCode = NetState.NET_3G;
                            break;
                        case TelephonyManager.NETWORK_TYPE_LTE:
                            stateCode = NetState.NET_4G;
                            break;
                        case TelephonyManager.NETWORK_TYPE_NR:
                            stateCode = NetState.NET_5G;
                            break;
                        default:
                            L.d(tag_,"getDataNetworkType type err ");
                            stateCode = NetState.NET_UNKNOWN;
                            break;
                    }
                }else {
                    L.d(tag_,"NetworkCapabilities type err");
                    stateCode = NetState.NET_NO_CONNECT;
                }
    
    
            } else {
                NetworkInfo ni = cm.getActiveNetworkInfo();
                if (ni != null && ni.isConnectedOrConnecting()) {
                    switch (ni.getType()) {
                        case ConnectivityManager.TYPE_WIFI:
                            stateCode = NetState.NET_WIFI;
                            break;
                        case ConnectivityManager.TYPE_MOBILE:
                            switch (ni.getSubtype()) {
                                case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
                                case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
                                case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
                                case TelephonyManager.NETWORK_TYPE_1xRTT:
                                case TelephonyManager.NETWORK_TYPE_IDEN:
                                    stateCode = NetState.NET_2G;
                                    break;
                                case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
                                case TelephonyManager.NETWORK_TYPE_UMTS:
                                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                                case TelephonyManager.NETWORK_TYPE_HSDPA:
                                case TelephonyManager.NETWORK_TYPE_HSUPA:
                                case TelephonyManager.NETWORK_TYPE_HSPA:
                                case TelephonyManager.NETWORK_TYPE_EVDO_B:
                                case TelephonyManager.NETWORK_TYPE_EHRPD:
                                case TelephonyManager.NETWORK_TYPE_HSPAP:
                                    stateCode = NetState.NET_3G;
                                    break;
                                case TelephonyManager.NETWORK_TYPE_LTE:
                                    stateCode = NetState.NET_4G;
                                    break;
                                case TelephonyManager.NETWORK_TYPE_NR:
                                    stateCode = NetState.NET_5G;
                                    break;
                                default:
                                    stateCode = NetState.NET_UNKNOWN;
                            }
                            break;
                        default:
                            stateCode = NetState.NET_UNKNOWN;
                    }
    
                }
            }
    
    
            return stateCode;
        }
    
    

    相关文章

      网友评论

          本文标题:Android 11可用的 3G 4G 5G,网络类型判断

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