开发中有时需要对设备的网络类型进行展示,用的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