美文网首页
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