Android判斷用戶的網絡類型(2/3/4G、wifi)

不少時候須要先判斷當前用戶的網絡,纔會繼續以後的一些處理邏輯。但網絡類型獲取這一塊,我用我本身的的手機調試時遇到一些問題,這裏記錄一下。html

一加手機一代,移動4G 網絡,獲得的subtype類型值爲17,我查過Android 5.1的源碼,它最大的值也就爲16。(點擊這裏在線查看源碼>>)api

我拿魅族的移動4G測試的結果以下:網絡

小米4,電信4G的測試結果以下:app

魅族MX4,聯通3Gless

還測試了其它華爲移動3G/4G的狀況,就我本身的手機一加返回的值有點奇怪,以後我查了一下它的參數:http://detail.zol.com.cn/374/373908/param.shtml測試

固然,其它廠商:華爲、小米、魅族與上面顯示的網絡類型基本上是一致的。都是3G:TD-SCDMA、WCDMA等調試

而目前測試的狀況就是僅一加返回的值爲17,這會致使正常的判斷出現問題,沒法識別到底使用的是何種網絡。而我經過logcat的日誌,卻很清晰的發現系統本身是能識別的日誌

最後我根據網絡上提供的資料,加了一項比較特殊的判斷,演變成以下的代碼:code

public static String GetNetworkType() { String strNetworkType = "";htm

NetworkInfo networkInfo = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
{
    if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
    {
        strNetworkType = "WIFI";
    }
    else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
    {
        String _strSubTypeName = networkInfo.getSubtypeName();
        
        Log.e("cocos2d-x", "Network getSubtypeName : " + _strSubTypeName);
        
        // TD-SCDMA   networkType is 17
        int networkType = networkInfo.getSubtype();
        switch (networkType) {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
                strNetworkType = "2G";
                break;
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9 : replace by 14
            case TelephonyManager.NETWORK_TYPE_EHRPD:  //api<11 : replace by 12
            case TelephonyManager.NETWORK_TYPE_HSPAP:  //api<13 : replace by 15
                strNetworkType = "3G";
                break;
            case TelephonyManager.NETWORK_TYPE_LTE:    //api<11 : replace by 13
                strNetworkType = "4G";
                break;
            default:
                // http://baike.baidu.com/item/TD-SCDMA 中國移動 聯通 電信 三種3G制式
                if (_strSubTypeName.equalsIgnoreCase("TD-SCDMA") || _strSubTypeName.equalsIgnoreCase("WCDMA") || _strSubTypeName.equalsIgnoreCase("CDMA2000")) 
                {
                    strNetworkType = "3G";
                }
                else
                {
                    strNetworkType = _strSubTypeName;
                }
                
                break;
         }
         
        Log.e("cocos2d-x", "Network getSubtype : " + Integer.valueOf(networkType).toString());
    }
}

Log.e("cocos2d-x", "Network Type : " + strNetworkType);

return strNetworkType;

}

但願對須要的人有所幫助吧。我在網上搜索到,以前其實有人提出過相似的疑問,可是沒有答案:

telephony.getNetworkType() 這個方法爲何在有些手機裏面獲取的值API沒有呢,例如1六、17。這兩個在 TelephonyManager這個API裏面就沒有

http://a.code4app.com/qa/q/55237d8b933bf062538b4f5d

參考連接:

How to determine if network type is 2G, 3G or 4G

Comparison of wireless data standards

Android 判斷用戶2G/3G/4G移動數據網絡

TD-SCDMA

相關文章
相關標籤/搜索