国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
android如何判斷當(dāng)前網(wǎng)絡(luò)類型(聯(lián)網(wǎng),2g,3g,wifi等)

摘要 一般對(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ò)的類型。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android網(wǎng)絡(luò)連接判斷與處理
管理網(wǎng)絡(luò)的使用情況
新手必備的常用代碼片段整理(一)
獲取Android手機(jī)網(wǎng)絡(luò)類型和IP地址
android 網(wǎng)絡(luò)是否可用
【轉(zhuǎn)】android 實(shí)現(xiàn)檢查網(wǎng)絡(luò)是否可用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服