(转)Android 判断用户2G/3G/4G移动数据网络
在做 Android App 的時候,為了給用戶省流量,為了不激起用戶的憤怒,為了更好的用戶體驗,是需(要根據(jù)用戶當前網(wǎng)絡情況來做一些調(diào)整的,也可以在 App 的設置模塊里,讓用戶自己選擇,在 2G / 3G / 4G 網(wǎng)絡條件下,是否允許請求一些流量比較大的數(shù)據(jù)。
通過 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以獲取到 NetworksInfo 對象,可以通過 getType() 獲取類型,判斷是 wifi 還是 mobile ,如果是 mobile ,可以通過 NetworksInfo 對象的 getSubType() 和 getSubTypeName() 可以獲取到對于的網(wǎng)絡類型和名字。
網(wǎng)絡類型和名字定義在 TelephonyManager 類里。
/** 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;看到這個代碼和注釋,相信沒有這方面知識的人很難看懂,都啥玩意?這注釋跟沒注釋有啥區(qū)別?!就是讓人看著更加鬧心而已。所以說,注釋對閱讀代碼的人很重要。當然這些東西可能太專業(yè)了,寫這些代碼的人估計是想寫也不知道該怎么了,得寫多大一坨啊?!我在最后會貼上一些我整理的資料,可以供大家參考一下,不是很詳細,也不專業(yè),就是大概有個印象。
TelephonyManager 還提供了 getNetworkTypeName(int type) 的方法,這個方法可以返回一個字符串,但是信息量不大。
那怎么判斷是 2G , 3G 還是 4G 網(wǎng)絡呢?TelephonyManager 還提供了另外一個方法,getNetworkClass(int networkType) ,但這個方法被隱藏掉了,我把代碼貼一下。
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;} }然后下面是這幾個常量的值。
/** 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;不知道為啥要把這些東西給隱藏起來,然道是不靠譜?!還是其他的更好的方式?!不知道,先這樣吧,現(xiàn)在通過上面的手段,是可以知道用戶用的是什么網(wǎng)絡,當然也可以區(qū)分出來用戶使用的是 2G , 3G 還是 4G 了。當然,你獲取到這些數(shù)據(jù)后,你也可以推算出用戶用的是哪家公司的網(wǎng)絡,移動的,聯(lián)通的,還是電信的,當然,只在中國。而且虛擬運營商開始真正上市后,這個就區(qū)分不出來是京東的,還是國美,蘇寧的了,但是你可以知道你的手機號用的是聯(lián)通的網(wǎng)還是移動的網(wǎng)。
總結(jié)
以上是生活随笔為你收集整理的(转)Android 判断用户2G/3G/4G移动数据网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: strcpy 通过指针复制字符串出错问题
- 下一篇: Java基础-String、String