Android Network -------------------判断网络状态(网络的连接,改变,和判断2G/3G/4G)

来源:互联网 发布:淘宝r店是什么意思啊 编辑:程序博客网 时间:2024/05/17 23:52

博客为 有时个哥 原创,如需转载请标明出处:http://blog.csdn.net/ls703/article/details/45823485

现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是再访问网络之前,我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断,对应一些状态判断来做处理,并不是直接使用Http访问网络即可。很多人在开发就经常把网络这块直接跳过,直接访问网络,可以一断网,各种体验效果不好,不是说app没法用,只是体验效果差。还有,就是我们可能为用户考虑,因为现在一般连网是wifi和手机流量,都知道后者收费是比较高的。假如我们的app加载的图片或者有大的数据下载操作,可是用户的本意是要是在流量下的话就不要操作这些很费流量的的操作,这样就必须要我们做一些连网状态的判断。网络是否连接良好,连接的wifi还是流量,断网或者网络改变了的时候怎么做,这都是一些细节,但是要注意处理。

 

我们在做访问的时候都得进行判断是否连网。判断连网也比较简单,就用到了两个类。ConnectivityManager和NetworkInfo。

 

只要执行下面的代码就可以了。

ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);boolean isWifiConn = networkInfo.isConnected();networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);boolean isMobileConn = networkInfo.isConnected();


 

只要有一个连接就是有网,NetworkInfo就是网络的信息。还有一种更简便的判断是否连网的方法。

ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

 

在一个就是监听网络变化,就是设置一个广播。

注册广播,监听ConnectivityManager.CONNECTIVITY_ACTION这个action

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);receiver = new NetworkReceiver();context.registerReceiver(receiver, filter);


 

再实现一个广播类就可以了。这样网络一变化,就会受到广播,然后执行对应操作了。

public class NetworkReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.i("TAG", "intent============>>>>" + intent.toString());}}


下面就是来说一下判断手机网络的类型了,2G,3G,4G

关于网络类型,在得到networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);这个后,确定是手机网络后,通过networkInfo.getSubtype()会得到网络的类型,用networkInfo.getSubtypeName()会得到网络的名字。

我们通过这个networkInfo.getSubtype()得到的类型来判断当前是什么网络。

其实,Android的Api中已经定义了各种网络状态,不是在ConnectivityManager里面定义的,而是在TelephonyManager里面的定义的。通过不同的api版本的修改,目前增加到了14个状态值:

下面是通过自己查资料,和看别人查资料实验得来的。整理如下:

 

--------------------Added in API level 1---------------------public static final int NETWORK_TYPE_UNKNOWNNetwork type is unknownConstant Value: 0 (0x00000000)(不知道网络类型)public static final int NETWORK_TYPE_GPRSCurrent network is GPRSConstant Value: 1 (0x00000001)(2.5G)移动和联通public static final int NETWORK_TYPE_EDGECurrent network is EDGEConstant Value: 2 (0x00000002)(2.75G)2.5G到3G的过渡    移动和联通public static final int NETWORK_TYPE_UMTSCurrent network is UMTSConstant Value: 3 (0x00000003)(3G)联通-----------------Added in API level 4---------------------public static final int NETWORK_TYPE_CDMACurrent network is CDMA: Either IS95A or IS95BConstant Value: 4 (0x00000004)(2G 电信)public static final int NETWORK_TYPE_EVDO_0Current network is EVDO revision 0Constant Value: 5 (0x00000005)( 3G )电信public static final int NETWORK_TYPE_EVDO_ACurrent network is EVDO revision AConstant Value: 6 (0x00000006)(3.5G) 属于3G过渡public static final int NETWORK_TYPE_1xRTTCurrent network is 1xRTTConstant Value: 7 (0x00000007)( 2G )---------------------Added in API level 5--------------------public static final int NETWORK_TYPE_HSDPACurrent network is HSDPAConstant Value: 8 (0x00000008)(3.5G )public static final int NETWORK_TYPE_HSUPACurrent network is HSUPAConstant Value: 9 (0x00000009)( 3.5G )public static final int NETWORK_TYPE_HSPACurrent network is HSPAConstant Value: 10 (0x0000000a)( 3G )联通--------------------------Added in API level 8-------------------------public static final int NETWORK_TYPE_IDENCurrent network is iDenConstant Value: 11 (0x0000000b)(2G )--------------------------Added in API level 9-------------------------public static final int NETWORK_TYPE_EVDO_BCurrent network is EVDO revision BConstant Value: 12 (0x0000000c)3G-3.5G--------------------------Added in API level 11------------------------public static final int NETWORK_TYPE_LTECurrent network is LTEConstant Value: 13 (0x0000000d)(4G)public static final int NETWORK_TYPE_EHRPDCurrent network is eHRPDConstant Value: 14 (0x0000000e)3G(3G到4G的升级产物)--------------------------Added in API level 13---------------------------public static final int NETWORK_TYPE_HSPAPCurrent network is HSPA+Constant Value: 15 (0x0000000f)( 3G )

 所以我们可以networkInfo.getSubtype()得到值和上面的进行对应,就知道目前是几G网络了。由于手里的手机卡有限,所以有些不全,欢迎大家补充,共享。

 

 


 

3 0