天天看點

Android擷取網絡類型:2G、3G、4G或wifi,擷取營運商名稱

本篇主要講的是如何擷取網絡類型和營運商名稱。

下面是主要内容:

  • NetUtils 工具類
  • 添權重限
  • 具體使用

1.NetUtils工具類(複制既可用)

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

/**
 * author: wu
 * date: on 2018/11/20.
 * describe:擷取網絡狀态
 */

public class NetUtils {
    public static final int NETWORK_NONE = 0; // 沒有網絡連接配接
    public static final int NETWORK_WIFI = 1; // wifi連接配接
    public static final int NETWORK_2G = 2; // 2G
    public static final int NETWORK_3G = 3; // 3G
    public static final int NETWORK_4G = 4; // 4G
    public static final int NETWORK_MOBILE = 5; // 手機流量

    /**
     * 擷取營運商名字
     * @return int
     */
    public static String getOperatorName(Context context) {
        /*
         * getSimOperatorName()就可以直接擷取到營運商的名字
         * 也可以使用IMSI擷取,getSimOperator(),然後根據傳回值判斷,例如"46000"為移動
         * IMSI相關連結:http://baike.baidu.com/item/imsi
         */
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        // getSimOperatorName就可以直接擷取到營運商的名字
        return telephonyManager.getSimOperatorName();
    }

    /**
     * 擷取目前網絡連接配接的類型
     * @return int
     */
    public static int getNetworkState(Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 擷取網絡服務
        if (null == connManager) { // 為空則認為無網絡
            return NETWORK_NONE;
        }
        // 擷取網絡類型,如果為空,傳回無網絡
        @SuppressLint("MissingPermission") NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();
        if (activeNetInfo == null || !activeNetInfo.isAvailable()) {
            return NETWORK_NONE;
        }
        // 判斷是否為WIFI
        @SuppressLint("MissingPermission") NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (null != wifiInfo) {
            NetworkInfo.State state = wifiInfo.getState();
            if (null != state) {
                if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
                    return NETWORK_WIFI;
                }
            }
        }
        // 若不是WIFI,則去判斷是2G、3G、4G網
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        int networkType = telephonyManager.getNetworkType();
        switch (networkType) {
            /*
             GPRS : 2G(2.5) General Packet Radia Service 114kbps
             EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
             UMTS : 3G WCDMA 聯通3G Universal Mobile Telecommunication System 完整的3G移動通信技術标準
             CDMA : 2G 電信 Code Division Multiple Access 碼分多址
             EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 屬于3G
             EVDO_A : 3G 1.8mbps - 3.1mbps 屬于3G過渡,3.5G
             1xRTT : 2G CDMA2000 1xRTT (RTT - 無線電傳輸技術) 144kbps 2G的過渡,
             HSDPA : 3.5G 高速下行分組接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps
             HSUPA : 3.5G High Speed Uplink Packet Access 高速上行鍊路分組接入 1.4 - 5.8 mbps
             HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access
             IDEN : 2G Integrated Dispatch Enhanced Networks 內建數字增強型網絡 (屬于2G,來自維基百科)
             EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
             LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G過渡,更新版 LTE Advanced 才是4G
             EHRPD : 3G CDMA2000向LTE 4G的中間産物 Evolved High Rate Packet Data HRPD的更新
             HSPAP : 3G HSPAP 比 HSDPA 快些
             */
            // 2G網絡
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                return NETWORK_2G;
            // 3G網絡
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            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:
                return NETWORK_3G;
            // 4G網絡
            case TelephonyManager.NETWORK_TYPE_LTE:
                return NETWORK_4G;
            default:
                return NETWORK_MOBILE;
        }
    }

    /**
     * 判斷網絡是否連接配接
     * @return true/false
     */
    public static boolean isNetConnected(Context context) {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            @SuppressLint("MissingPermission") NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (info != null && info.isConnected()) {
                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判斷是否wifi連接配接
     * @return true/false
     */
    public static synchronized boolean isWifiConnected(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            @SuppressLint("MissingPermission") NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null) {
                int networkInfoType = networkInfo.getType();
                if (networkInfoType == ConnectivityManager.TYPE_WIFI || networkInfoType == ConnectivityManager.TYPE_ETHERNET) {
                    return networkInfo.isConnected();
                }
            }
        }
        return false;
    }
}
           

2. 添權重限

不要忘記添權重限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
           

3. 具體使用

下面是我在 Activity 中使用方法,擷取營運商名稱,是否有網絡,網絡類型等:

private String operatorName;//營運商名字
    private int netWorkState;//網絡為:2G、3G、4G
    private boolean netConnected;//是否有網絡
    private boolean wifiConnected;//網絡是否為wifi
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        operatorName = NetUtils.getOperatorName(this);
        netWorkState = NetUtils.getNetworkState(this);
        netConnected = NetUtils.isNetConnected(this);
        wifiConnected = NetUtils.isWifiConnected(this);
        Log.e("==營運商名字", operatorName+"");
        Log.e("==網絡為", netWorkState+"");
        Log.e("==是否有網絡", netConnected+"");
        Log.e("==網絡是否為wifi", wifiConnected+"");
    }
           

下面是運作之後的列印結果:

Android擷取網絡類型:2G、3G、4G或wifi,擷取營運商名稱

可以看出,我的手機有網絡,是 wifi 連接配接。