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

http://www.binkery.com/archives/368.html

 

           

在做 Android App 的時候,爲了給用戶省流量,爲了不激起用戶的憤怒,爲了更好的用戶體驗,是需要根據用戶當前網絡情況來做一些調整的,也可以在 App 的設置模塊裏,讓用戶自己選擇,在 2G / 3G / 4G 網絡條件下,是否允許請求一些流量比較大的數據。轉載請註明來自:http://www.binkery.com/

通過 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以獲取到 NetworksInfo 對象,可以通過 getType() 獲取類型,判斷是 wifi 還是 mobile ,如果是 mobile ,可以通過 NetworksInfo 對象的 getSubType() 和 getSubTypeName() 可以獲取到對於的網絡類型和名字。轉載請註明來自:http://www.binkery.com/

網絡類型和名字定義在 TelephonyManager 類裏。轉載請註明來自:http://www.binkery.com/

/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN = 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE = 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD = 14;
/** Current network is HSPA+ */
public static final int NETWORK_TYPE_HSPAP = 15;

看到這個代碼和註釋,相信沒有這方面知識的人很難看懂,都啥玩意?這注釋跟沒註釋有啥區別?!就是讓人看着更加鬧心而已。所以說,註釋對閱讀代碼的 人很重要。當然這些東西可能太專業了,寫這些代碼的人估計是想寫也不知道該怎麼了,得寫多大一坨啊?!我在最後會貼上一些我整理的資料,可以供大家參考一 下,不是很詳細,也不專業,就是大概有個印象。轉載請註明來自:http://www.binkery.com/

TelephonyManager 還提供了 getNetworkTypeName(int type) 的方法,這個方法可以返回一個字符串,但是信息量不大。轉載請註明來自:http://www.binkery.com/

android.telephony.TelephonyManager 的具體路徑:/sdk-path/sources/android-xx/android/telephony/TelephonyManager.java轉載請註明來自:http://www.binkery.com/

那怎麼判斷是 2G , 3G 還是 4G 網絡呢?TelephonyManager 還提供了另外一個方法,getNetworkClass(int networkType) ,但這個方法被隱藏掉了,我把代碼貼一下。轉載請註明來自:http://www.binkery.com/

public static int getNetworkClass(int networkType) {
    switch (networkType) {
        case NETWORK_TYPE_GPRS:
        case NETWORK_TYPE_EDGE:
        case NETWORK_TYPE_CDMA:
        case NETWORK_TYPE_1xRTT:
        case NETWORK_TYPE_IDEN:
    return NETWORK_CLASS_2_G;
        case NETWORK_TYPE_UMTS:
        case NETWORK_TYPE_EVDO_0:
        case NETWORK_TYPE_EVDO_A:
        case NETWORK_TYPE_HSDPA:
        case NETWORK_TYPE_HSUPA:
        case NETWORK_TYPE_HSPA:
        case NETWORK_TYPE_EVDO_B:
        case NETWORK_TYPE_EHRPD:
        case NETWORK_TYPE_HSPAP:
    return NETWORK_CLASS_3_G;
        case NETWORK_TYPE_LTE:
    return NETWORK_CLASS_4_G;
        default:
    return NETWORK_CLASS_UNKNOWN;
    }
}

然後下面是這幾個常量的值。轉載請註明來自:http://www.binkery.com/

/** Unknown network class. {@hide} */
public static final int NETWORK_CLASS_UNKNOWN = 0;
/** Class of broadly defined "2G" networks. {@hide} */
public static final int NETWORK_CLASS_2_G = 1;
/** Class of broadly defined "3G" networks. {@hide} */
public static final int NETWORK_CLASS_3_G = 2;
/** Class of broadly defined "4G" networks. {@hide} */
public static final int NETWORK_CLASS_4_G = 3;

不知道爲啥要把這些東西給隱藏起來,然道是不靠譜?!還是其他的更好的方式?!不知道,先這樣吧,現在通過上面的手段,是可以知道用戶用的是什麼網 絡,當然也可以區分出來用戶使用的是 2G , 3G 還是 4G 了。當然,你獲取到這些數據後,你也可以推算出用戶用的是哪家公司的網絡,移動的,聯通的,還是電信的,當然,只在中國。而且虛擬運營商開始真正上市後, 這個就區分不出來是京東的,還是國美,蘇寧的了,但是你可以知道你的手機號用的是聯通的網還是移動的網。轉載請註明來自:http://www.binkery.com/

貼上我收集整理的一些資料,可以參考一下。轉載請註明來自:http://www.binkery.com/

  •  
  • 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 快些
  •  

有朋友說他是移動 4G 的網絡,獲取到的是 17。於是我又去翻了一下源碼,找到了如下的代碼。也就是說當有新的類型被支持的時候,Android 會增加對於的類型代碼。確實 17 是 NETWORK_TYPE_TD_SCDMA 也就是移動的那一坨。其他的代碼就不貼了,大概就是這個意思。下面的代碼是5.1的代碼。轉載請註明來自:http://www.binkery.com/

/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN = 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE = 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD = 14;
/** Current network is HSPA+ */
public static final int NETWORK_TYPE_HSPAP = 15;
/** Current network is GSM {@hide} */
public static final int NETWORK_TYPE_GSM = 16;
/** Current network is TD_SCDMA {@hide} */
public static final int NETWORK_TYPE_TD_SCDMA = 17;
/** Current network is IWLAN {@hide} */
public static final int NETWORK_TYPE_IWLAN = 18;

           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章