一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。

关于Android如何检测网络的类型,网上代码很多,但是有用的不多,真正解决了问题的我只找到一篇(见文章末尾网址),为了更好的方便自己理解,对这片文章做了解释和整理。

在android中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判断当前是否联网:

    public static boolean isNetworkConnected() {        ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo ni = cm.getActiveNetworkInfo();        return ni != null && ni.isConnectedOrConnecting();    }

其中有个疑问,isConnectedOrConnecting()从字面上看是是否连接或者正在连接,如果正在连接的是一个不可用的网络,那应该算不联网的吧 ,所以我觉得还是改成isConnected()好些,根据个人的需求吧。

上面只是判断是否联网,跟我们的目的还有很大的差距,为了获得具体的网络类型需要对NetworkInfo中的信息进一步分解,NetworkInfo的getTypeName()方法可以判断出是wifi还是mobile网络,与getTypeName()方法对应的是getType方法,返回的是代表连接类型的整形常量,api中标明的有

ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH

五种,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。

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

    /** 没有网络 */    public static final int NETWORKTYPE_INVALID = 0;    /** wap网络 */    public static final int NETWORKTYPE_WAP = 1;    /** 2G网络 */    public static final int NETWORKTYPE_2G = 2;    /** 3G和3G以上网络,或统称为快速网络 */    public static final int NETWORKTYPE_3G = 3;    /** wifi网络 */    public static final int NETWORKTYPE_WIFI = 4;

这些常量将在后面用到。

下面我们通过一个方法来实现判断是wifi还是移动网络,如果是移动网络再通过其他方法进一步分析是3g还是2g:

    /**         * 获取网络状态,wifi,wap,2g,3g.         *         * @param context 上下文         * @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G},          *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* 

{@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; }

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

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;        }    }

整个过程可总结为:第一步通过ConnectivityManager判断是wifi还是mobile网络,在通过TelephonyManager判断移动网络的类型。

参考:http://blog.csdn.net/nanzhiwen666/article/details/8288433#

 

更多相关文章

  1. Android读取工程内嵌资源文件的两种方法
  2. Android Studio:10分钟教会你做百度地图定位!并解决SDK22中方法报
  3. Android——Json和Gson分别是什么,以及Json 数据的解析方法
  4. android开发打印票据或文档的方法:android打印文档的类
  5. android下自定义字体的使用方法
  6. [Android Studio系列(三)]Android Studio 编译、同步慢的解决方
  7. Android网络编程——https 不验证证书方式(信任所有证书)
  8. android 方法数越界问题 65536/64k(方法数超过65535)

随机推荐

  1. Toast小结
  2. Android--AIDL,一种实现进程间通信的方式
  3. android 自定义adapter extends BaseAdap
  4. android真机调试,在ubuntu11.10无法找到设
  5. Android 实现任务栏出现类似短信的提示功
  6. 了解Android权限
  7. Android (shape,gradient)详解
  8. Android(安卓)自定义view仿微信相机单击
  9. android 二级listview菜单。类似QQ的好友
  10. Android(安卓)Bluetooth研究