Android如何判断网络类型

开发中有时需要对设备的网络类型进行展示,用的wifi还是3g网络,开发板是连接的以太网etc。

网上关于Android检测网络类型的代码很多,这里为了方便理解,对项目中用到的代码整理一遍,

Android中判断网络类型需要用到ConnectivityManager类,首先我们先检查设备是否连接到网路。

// 检查是否连接到网络,连接上的网有没有信号,这里我们并不清楚todo
// whether connect to internet
public static boolean networkConnected() {
    if (context != null) {
        ConnectivityManager manager = (ConnectivityManager)  App.getContext().
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = manager.getActiveNetworkInfo();
        return info != null && info.isAvailable();
    }
    return false;
}

获取网络类型需要我们对NetworkInfo进行分析,NetworkInfo提供了getTypeName()和getType()方法来判断连接的是wifi还是mobile网络。

比如想要知道设备是否连接上以太网(一般是Android开发板上面会用到)

// 检查以太网络是否连接
// if mobile data connect
public static boolean ethrnetConnected() {
    ConnectivityManager manager = (ConnectivityManager) App.getContext().
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    if (info != null) {
        if (info.getType() == TYPE_ETHERNET)
            return true;
    }
    return false;
}

这边TYPE_ETHERNET是以太网的类型码,比较常用的还有TYPE_WIFI、TYPE_MOBILE等,大家可以自行百度,谷歌。wifi、手机网络是否连接和上面的写法差不多,就不一一叙述了。(注意App.getContext()这里的Context不能为空)。

下面通过一个方法来实现判断是wifi、移动网络还是以太网,移动网络还需进一步分析是2、3、4g。

先定义一些整形变量代表不同的网络。

/*** 没有网络*/
public static final int NETWORK_TYPE_INVALID = 0;
/*** WIFI网络*/
public static final int NETWORK_TYPE_WIFI = 1;
/*** 2G网络*/
public static final int NETWORK_TYPE_2G = 2;
/*** 3G网络*/
public static final int NETWORK_TYPE_3G = 3;
/*** Wap网络*/
public static final int NETWORK_TYPE_WAP = 4;
/*** 以太网络*/
public static final int NETWORK_TYPE_ETHERNET = 5;
public static int getNetWorkType() {
    int mNetWorkType = 0;
    ConnectivityManager manager = (ConnectivityManager) App.getContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        String type = networkInfo.getTypeName();
        if (type.equalsIgnoreCase("WIFI")) {
            mNetWorkType = NETWORK_TYPE_WIFI;
        } else if (type.equalsIgnoreCase("MOBILE")) {
            String proxyHost = android.net.Proxy.getDefaultHost();
            mNetWorkType = TextUtils.isEmpty(proxyHost)
                    ? (isFastMobileNetwork() ? NETWORK_TYPE_3G : NETWORK_TYPE_2G)
                    : NETWORK_TYPE_WAP;
        } else if (type.equalsIgnoreCase("ETHERNET")) {
            mNetWorkType = NETWORK_TYPE_ETHERNET;
        }
    } else {
        mNetWorkType = NETWORK_TYPE_INVALID;
    }
    return mNetWorkType;
}

其中为了区别是3g还是2g我们定义了isFastMobileNetwork()方法,主要用到了TelephonyManager类:

private static boolean isFastMobileNetwork() {
    TelephonyManager telephonyManager = (TelephonyManager) App.getContext().
            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;
    }
}

总结:整个流程走下来我们先通过ConnectivityManager来判断是否连接上网络==》是wifi、以太网还是mobile,在通过TelephonyManager来判断移动网络的类型。

参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0607/1621.html

转载于:https://my.oschina.net/u/2396529/blog/1094072

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值