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


很多時候需要先判斷當前用戶的網絡,才會繼續之后的一些處理邏輯。但網絡類型獲取這一塊,我用我自己的的手機調試時遇到一些問題,這里記錄一下。



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

 

我拿魅族的移動4G測試的結果如下:



 

 

 

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





魅族MX4,聯通3G



 

還測試了其它華為移動3G/4G的情況,就我自己的手機一加返回的值有點奇怪,之后我查了一下它的參數:http://detail.zol.com.cn/374/373908/param.shtml

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

 

而目前測試的情況就是僅一加返回的值為17,這會導致正常的判斷出現問題,無法識別到底使用的是何種網絡。而我通過logcat的日志,卻很清晰的發現系統自己是能識別的



 

 

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

public static String GetNetworkType()
{
    String strNetworkType = "";
   
    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沒有呢,例如16、17。這兩個在 TelephonyManager這個API里面就沒有

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM