app拉新平台,搜索引擎的优化和推广,给图像做标注的网站,wordpress菜单 自定义菜单现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是再访问网络之前#xff0c;我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断#xff0c;对应一些状态判断来做处理#xff0c;并不是直接使用Http访问网络即可。很多人在开发就经常… 现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是再访问网络之前我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断对应一些状态判断来做处理并不是直接使用Http访问网络即可。很多人在开发就经常把网络这块直接跳过直接访问网络可以一断网各种体验效果不好不是说app没法用只是体验效果差。还有就是我们可能为用户考虑因为现在一般连网是wifi和手机流量都知道后者收费是比较高的。假如我们的app加载的图片或者有大的数据下载操作可是用户的本意是要是在流量下的话就不要操作这些很费流量的的操作这样就必须要我们做一些连网状态的判断。网络是否连接良好连接的wifi还是流量断网或者网络改变了的时候怎么做这都是一些细节但是要注意处理。 我们在做访问的时候都得进行判断是否连网。判断连网也比较简单就用到了这几个类。ConnectivityManager、TelephonyManager 和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);
再实现一个广播类就可以了。这样网络一变化就会受到广播然后执行对应操作了。 Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, intent intent.toString());}}下面就是来说一下判断手机网络的类型了2G3G4G 关于网络类型在得到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_UNKNOWN
Network type is unknown
Constant Value: 0 (0x00000000)
(不知道网络类型)public static final int NETWORK_TYPE_GPRS
Current network is GPRS
Constant Value: 1 (0x00000001)
(2.5G移动和联通public static final int NETWORK_TYPE_EDGE
Current network is EDGE
Constant Value: 2 (0x00000002)
(2.75G)2.5G到3G的过渡 移动和联通public static final int NETWORK_TYPE_UMTS
Current network is UMTS
Constant Value: 3 (0x00000003)
(3G)联通-----------------Added in API level 4---------------------
public static final int NETWORK_TYPE_CDMA
Current network is CDMA: Either IS95A or IS95B
Constant Value: 4 (0x00000004)
(2G 电信)public static final int NETWORK_TYPE_EVDO_0
Current network is EVDO revision 0
Constant Value: 5 (0x00000005)
( 3G )电信public static final int NETWORK_TYPE_EVDO_A
Current network is EVDO revision A
Constant Value: 6 (0x00000006)
(3.5G) 属于3G过渡public static final int NETWORK_TYPE_1xRTT
Current network is 1xRTT
Constant Value: 7 (0x00000007)
( 2G )---------------------Added in API level 5--------------------
public static final int NETWORK_TYPE_HSDPA
Current network is HSDPA
Constant Value: 8 (0x00000008)
(3.5G )public static final int NETWORK_TYPE_HSUPA
Current network is HSUPA
Constant Value: 9 (0x00000009)
( 3.5G )public static final int NETWORK_TYPE_HSPA
Current network is HSPA
Constant Value: 10 (0x0000000a)
( 3G )联通--------------------------Added in API level 8-------------------------
public static final int NETWORK_TYPE_IDEN
Current network is iDen
Constant Value: 11 (0x0000000b)
(2G )--------------------------Added in API level 9-------------------------
public static final int NETWORK_TYPE_EVDO_B
Current network is EVDO revision B
Constant Value: 12 (0x0000000c)
3G-3.5G--------------------------Added in API level 11------------------------
public static final int NETWORK_TYPE_LTE
Current network is LTE
Constant Value: 13 (0x0000000d)
(4G)public static final int NETWORK_TYPE_EHRPD
Current network is eHRPD
Constant Value: 14 (0x0000000e)
3G(3G到4G的升级产物)--------------------------Added in API level 13---------------------------
public static final int NETWORK_TYPE_HSPAP
Current network is HSPA
Constant Value: 15 (0x0000000f)
( 3G )所以我们可以networkInfo.getSubtype()得到值和上面的进行对应就知道目前是几G网络了。由于手里的手机卡有限所以有些不全欢迎大家补充共享。 网络类型和名字定义在 TelephonyManager 类里。
/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD 14;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPAP 15;看到这个代码和注释相信没有这方面知识的人很难看懂都啥玩意这注释跟没注释有啥区别就是让人看着更加闹心而已。所以说注释对阅读代码的人很重要。当然这些东西可能太专业了写这些代码的人估计是想写也不知道该怎么了得写多大一坨啊我在最后会贴上一些我整理的资料可以供大家参考一下不是很详细也不专业就是大概有个印象。 TelephonyManager 还提供了 getNetworkTypeName(int type) 的方法这个方法可以返回一个字符串但是信息量不大。 那怎么判断是 2G 3G 还是 4G 网络呢TelephonyManager 还提供了另外一个方法getNetworkClass(int networkType) 但这个方法被隐藏掉了我把代码贴一下。 public static int getNetworkClass(int networkType) {
Switch (networkType) {
case NETWORK_TYPE_GPRS:
case NETWORK_TYPE_EDGE:
case NETWORK_TYPE_CDMA:
case NETWORK_TYPE_1xRTT:
case NETWORK_TYPE_IDEN:
return NETWORK_CLASS_2_G;
case NETWORK_TYPE_UMTS:
case NETWORK_TYPE_EVDO_0:
case NETWORK_TYPE_EVDO_A:
case NETWORK_TYPE_HSDPA:
case NETWORK_TYPE_HSUPA:
case NETWORK_TYPE_HSPA:
case NETWORK_TYPE_EVDO_B:
case NETWORK_TYPE_EHRPD:
case NETWORK_TYPE_HSPAP:
return NETWORK_CLASS_3_G;
case NETWORK_TYPE_LTE:
return NETWORK_CLASS_4_G;
default:
return NETWORK_CLASS_UNKNOWN;
}
}然后下面是这几个常量的值。
/** Unknown network class. {hide} */
public static final int NETWORK_CLASS_UNKNOWN 0;
/** Class of broadly defined 2G networks. {hide} */
public static final int NETWORK_CLASS_2_G 1;
/** Class of broadly defined 3G networks. {hide} */
public static final int NETWORK_CLASS_3_G 2;
/** Class of broadly defined 4G networks. {hide} */
public static final int NETWORK_CLASS_4_G 3;不知道为啥要把这些东西给隐藏起来然道是不靠谱还是其他的更好的方式不知道先这样吧现在通过上面的手段是可以知道用户用的是什么网络当然也可以区分出来用户使用的是 2G 3G 还是 4G 了。当然你获取到这些数据后你也可以推算出用户用的是哪家公司的网络移动的联通的还是电信的当然只在中国。而且虚拟运营商开始真正上市后这个就区分不出来是京东的还是国美苏宁的了但是你可以知道你的手机号用的是联通的网还是移动的网。 最后贴上我收集整理的一些资料可以参考一下。
GPRS 2G(2.5) General Packet Radia Service 114kbps
EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
UMTS 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准
CDMA 2G 电信 Code Division Multiple Access 码分多址
EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G
EVDO_A 3G 1.8mbps - 3.1mbps 属于3G过渡3.5G
1xRTT 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡,
HSDPA 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps
HSUPA 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps
HSPA 3G (分HSDPA,HSUPA) High Speed Packet Access
IDEN 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 属于2G来自维基百科
EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡升级版 LTE Advanced 才是4G
EHRPD 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级
HSPAP 3G HSPAP 比 HSDPA 快些