摘要 一般對(duì)網(wǎng)絡(luò)的判斷都是判斷是否聯(lián)網(wǎng),不過有時(shí)候我們需要知道具體的網(wǎng)絡(luò)類型,比如在3g網(wǎng)絡(luò)下,百度地圖的定位功能存在很大的偏差,這就需要提前判斷網(wǎng)絡(luò)類型針對(duì)3g網(wǎng)絡(luò)情況做特殊的處理。 關(guān)于Android如何檢測網(wǎng)絡(luò)的類型,網(wǎng)上代碼很多,但是有用的不多,真正
一般對(duì)網(wǎng)絡(luò)的判斷都是判斷是否聯(lián)網(wǎng),不過有時(shí)候我們需要知道具體的網(wǎng)絡(luò)類型,比如在3g網(wǎng)絡(luò)下,百度地圖的定位功能存在很大的偏差,這就需要提前判斷網(wǎng)絡(luò)類型針對(duì)3g網(wǎng)絡(luò)情況做特殊的處理。
關(guān)于Android如何檢測網(wǎng)絡(luò)的類型,網(wǎng)上代碼很多,但是有用的不多,真正解決了問題的我只找到一篇(見文章末尾網(wǎng)址),為了更好的方便自己理解,對(duì)這片文章做了解釋和整理。
在android中判斷網(wǎng)絡(luò)需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判斷當(dāng)前是否聯(lián)網(wǎng):
1 2 3 4 5 | public static boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != null && ni.isConnectedOrConnecting(); } |
其中有個(gè)疑問,isConnectedOrConnecting()
從字面上看是是否連接或者正在連接,如果正在連接的是一個(gè)不可用的網(wǎng)絡(luò),那應(yīng)該算不聯(lián)網(wǎng)的吧 ,所以我覺得還是改成isConnected()好些,根據(jù)個(gè)人的需求吧。
上面只是判斷是否聯(lián)網(wǎng),跟我們的目的還有很大的差距,為了獲得具體的網(wǎng)絡(luò)類型需要對(duì)NetworkInfo
中的信息進(jìn)一步分解,NetworkInfo
的getTypeName()方法可以判斷出是wifi還是mobile網(wǎng)絡(luò),與getTypeName()方法對(duì)應(yīng)的是getType方法,返回的是代表連接類型的整形常量,api中標(biāo)明的有
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH
五種,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互聯(lián)網(wǎng)有關(guān)的,可見ConnectivityManager并不是專門管理互聯(lián)網(wǎng)連接的,還負(fù)責(zé)藍(lán)牙等連接。
先定義一些整形變量代表不同的網(wǎng)絡(luò):
1 2 3 4 5 6 7 8 9 10 | /** 沒有網(wǎng)絡(luò) */ public static final int NETWORKTYPE_INVALID = 0; /** wap網(wǎng)絡(luò) */ public static final int NETWORKTYPE_WAP = 1; /** 2G網(wǎng)絡(luò) */ public static final int NETWORKTYPE_2G = 2; /** 3G和3G以上網(wǎng)絡(luò),或統(tǒng)稱為快速網(wǎng)絡(luò) */ public static final int NETWORKTYPE_3G = 3; /** wifi網(wǎng)絡(luò) */ public static final int NETWORKTYPE_WIFI = 4; |
這些常量將在后面用到。
下面我們通過一個(gè)方法來實(shí)現(xiàn)判斷是wifi還是移動(dòng)網(wǎng)絡(luò),如果是移動(dòng)網(wǎng)絡(luò)再通過其他方法進(jìn)一步分析是3g還是2g:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 獲取網(wǎng)絡(luò)狀態(tài),wifi,wap,2g,3g. * * @param context 上下文 * @return int 網(wǎng)絡(luò)狀態(tài) {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI} */ public static int getNetWorkType(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { String type = networkInfo.getTypeName(); if (type.equalsIgnoreCase( "WIFI" )) { mNetWorkType = NETWORKTYPE_WIFI; } else if (type.equalsIgnoreCase( "MOBILE" )) { String proxyHost = android.net.Proxy.getDefaultHost(); mNetWorkType = TextUtils.isEmpty(proxyHost) (isFastMobileNetwork(context) ? NETWORKTYPE_3G : NETWORKTYPE_2G) : NETWORKTYPE_WAP; } } else { mNetWorkType = NETWORKTYPE_INVALID; } return mNetWorkType; } |
其中為了區(qū)別是3g還是2g我們定義了isFastMobileNetwork(context)
方法,主要用到了TelephonyManager
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | private static boolean isFastMobileNetwork(Context context) { TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_1xRTT: return false ; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false ; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false ; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true ; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true ; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false ; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true ; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true ; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true ; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true ; // ~ 400-7000 kbps case TelephonyManager.NETWORK_TYPE_EHRPD: return true ; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: return true ; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: return true ; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: return false ; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: return true ; // ~ 10+ Mbps case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false ; default : return false ; } } |
整個(gè)過程可總結(jié)為:第一步通過ConnectivityManager判斷是wifi還是mobile網(wǎng)絡(luò),在通過TelephonyManager判斷移動(dòng)網(wǎng)絡(luò)的類型。
聯(lián)系客服