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

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

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

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

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

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

12345public static boolean isNetworkConnected() {ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo ni = cm.getActiveNetworkInfo();returnni !=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并不是专门管理互联网连接的,还负责蓝牙等连接。

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

12345678910/** 没有网络 */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:

123456789101112131415161718192021222324/*** 获取网络状态,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;}elseif(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;}returnmNetWorkType;}

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

123456789101112131415161718192021222324252627282930313233343536373839private static boolean isFastMobileNetwork(Context context) {TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);switch(telephonyManager.getNetworkType()) {caseTelephonyManager.NETWORK_TYPE_1xRTT:returnfalse;// ~ 50-100 kbpscaseTelephonyManager.NETWORK_TYPE_CDMA:returnfalse;// ~ 14-64 kbpscaseTelephonyManager.NETWORK_TYPE_EDGE:returnfalse;// ~ 50-100 kbpscaseTelephonyManager.NETWORK_TYPE_EVDO_0:returntrue;// ~ 400-1000 kbpscaseTelephonyManager.NETWORK_TYPE_EVDO_A:returntrue;// ~ 600-1400 kbpscaseTelephonyManager.NETWORK_TYPE_GPRS:returnfalse;// ~ 100 kbpscaseTelephonyManager.NETWORK_TYPE_HSDPA:returntrue;// ~ 2-14 MbpscaseTelephonyManager.NETWORK_TYPE_HSPA:returntrue;// ~ 700-1700 kbpscaseTelephonyManager.NETWORK_TYPE_HSUPA:returntrue;// ~ 1-23 MbpscaseTelephonyManager.NETWORK_TYPE_UMTS:returntrue;// ~ 400-7000 kbpscaseTelephonyManager.NETWORK_TYPE_EHRPD:returntrue;// ~ 1-2 MbpscaseTelephonyManager.NETWORK_TYPE_EVDO_B:returntrue;// ~ 5 MbpscaseTelephonyManager.NETWORK_TYPE_HSPAP:returntrue;// ~ 10-20 MbpscaseTelephonyManager.NETWORK_TYPE_IDEN:returnfalse;// ~25 kbpscaseTelephonyManager.NETWORK_TYPE_LTE:returntrue;// ~ 10+ MbpscaseTelephonyManager.NETWORK_TYPE_UNKNOWN:returnfalse;default:returnfalse;}}

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

电脑资料

android如何判断当前网络类型(联网,2g,3g,wifi等)》(https://www.unjs.com)。

最新文章