android如何判断当前网络类型(联网,2g,3g,wifi等)

来源:互联网 发布:linux系统自启动脚本 编辑:程序博客网 时间:2024/05/18 18:52

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

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

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

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

  1. publicstaticboolean isNetworkConnected(){
  2. ConnectivityManager cm =(ConnectivityManager)AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
  3. NetworkInfo ni = cm.getActiveNetworkInfo();
  4. return ni !=null&& ni.isConnectedOrConnecting();
  5. }

其中有个疑问,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_MOBILEConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。

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

  1. /** 没有网络 */
  2. publicstaticfinalint NETWORKTYPE_INVALID=0;
  3. /** wap网络 */
  4. publicstaticfinalint NETWORKTYPE_WAP=1;
  5. /** 2G网络 */
  6. publicstaticfinalint NETWORKTYPE_2G=2;
  7. /** 3G和3G以上网络,或统称为快速网络 */
  8. publicstaticfinalint NETWORKTYPE_3G=3;
  9. /** wifi网络 */
  10. publicstaticfinalint NETWORKTYPE_WIFI=4;

这些常量将在后面用到。

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

  1. /**
  2. * 获取网络状态,wifi,wap,2g,3g.
  3. *
  4. * @param context 上下文
  5. * @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI}
  6. */
  7. publicstaticint getNetWorkType(Context context){
  8. ConnectivityManager manager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  9. NetworkInfo networkInfo= manager.getActiveNetworkInfo();
  10. if(networkInfo!=null&& networkInfo.isConnected()){
  11. String type= networkInfo.getTypeName();
  12. if(type.equalsIgnoreCase("WIFI")){
  13. mNetWorkType = NETWORKTYPE_WIFI;
  14. }elseif(type.equalsIgnoreCase("MOBILE")){
  15. String proxyHost= android.net.Proxy.getDefaultHost();
  16. mNetWorkType =TextUtils.isEmpty(proxyHost)
  17. ?(isFastMobileNetwork(context)? NETWORKTYPE_3G: NETWORKTYPE_2G)
  18. : NETWORKTYPE_WAP;
  19. }
  20. }else{
  21. mNetWorkType = NETWORKTYPE_INVALID;
  22. }
  23. return mNetWorkType;
  24. }

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

  1. privatestaticboolean isFastMobileNetwork(Context context){
  2. TelephonyManager telephonyManager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
  3. switch(telephonyManager.getNetworkType()){
  4. caseTelephonyManager.NETWORK_TYPE_1xRTT:
  5. returnfalse;// ~ 50-100 kbps
  6. caseTelephonyManager.NETWORK_TYPE_CDMA:
  7. returnfalse;// ~ 14-64 kbps
  8. caseTelephonyManager.NETWORK_TYPE_EDGE:
  9. returnfalse;// ~ 50-100 kbps
  10. caseTelephonyManager.NETWORK_TYPE_EVDO_0:
  11. returntrue;// ~ 400-1000 kbps
  12. caseTelephonyManager.NETWORK_TYPE_EVDO_A:
  13. returntrue;// ~ 600-1400 kbps
  14. caseTelephonyManager.NETWORK_TYPE_GPRS:
  15. returnfalse;// ~ 100 kbps
  16. caseTelephonyManager.NETWORK_TYPE_HSDPA:
  17. returntrue;// ~ 2-14 Mbps
  18. caseTelephonyManager.NETWORK_TYPE_HSPA:
  19. returntrue;// ~ 700-1700 kbps
  20. caseTelephonyManager.NETWORK_TYPE_HSUPA:
  21. returntrue;// ~ 1-23 Mbps
  22. caseTelephonyManager.NETWORK_TYPE_UMTS:
  23. returntrue;// ~ 400-7000 kbps
  24. caseTelephonyManager.NETWORK_TYPE_EHRPD:
  25. returntrue;// ~ 1-2 Mbps
  26. caseTelephonyManager.NETWORK_TYPE_EVDO_B:
  27. returntrue;// ~ 5 Mbps
  28. caseTelephonyManager.NETWORK_TYPE_HSPAP:
  29. returntrue;// ~ 10-20 Mbps
  30. caseTelephonyManager.NETWORK_TYPE_IDEN:
  31. returnfalse;// ~25 kbps
  32. caseTelephonyManager.NETWORK_TYPE_LTE:
  33. returntrue;// ~ 10+ Mbps
  34. caseTelephonyManager.NETWORK_TYPE_UNKNOWN:
  35. returnfalse;
  36. default:
  37. returnfalse;
  38. }
  39. }

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

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

0 0
原创粉丝点击