检测网络变化(wifi、2g、3g、4g)

1.注册广播"android.net.conn.CONNECTIVITY_CHANGE"和"android.net.wifi.STATE_CHANGE" 进行监听:
private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try
{
String action = intent.getAction();
Log.e("ConnectivityBroadcastReceiver", "action= "+action);
if ((!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)
&& !action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
|| !isListening_) {
return;
} if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
networkInfo_ = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(networkInfo_.isConnected()) {
// WIFI is connected
state_ = NET_STATE_WIFI_CONNECTED;
}else{
state_ = NET_STATE_DISCONNECTED;
}
} else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
networkInfo_ = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
String apn = networkInfo_.getExtraInfo();
Log.e("ConnectivityBroadcastReceiver", "apn= "+apn);
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if(networkInfo_.getType() == ConnectivityManager.TYPE_WIFI){
if ( networkInfo_.isConnected() ){
state_ = NET_STATE_WIFI_CONNECTED;
}else{
state_ = noConnectivity ? NET_STATE_DISCONNECTED : NET_STATE_WIFI_CONNECTED;
}
}else if(networkInfo_.getType() == ConnectivityManager.TYPE_MOBILE){
if (noConnectivity) {
state_ = NET_STATE_DISCONNECTED;
} else {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int type = telephonyManager.getNetworkType();
Log.e("ConnectivityBroadcastReceiver", "type= "+type);
state_ = getNetworkClass(type);
}
}else {
if (noConnectivity) {
state_ = NET_STATE_DISCONNECTED;
} else {
state_ = NET_STATE_UNKNOWN;
}
}
}
NotifyEvent();
}
catch (Exception e)
{
e.printStackTrace();
} }
};

2.判断TYPE_MOBILE下的网络类型:

private int getNetworkClass(int networkType) {
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
return NET_STATE_2G_CONNECTED;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
return NET_STATE_3G_CONNECTED;
case TelephonyManager.NETWORK_TYPE_LTE:
return NET_STATE_4G_CONNECTED;
default:
return NET_STATE_UNKNOWN;
}
}

3.在AndroidManifest.xml中加上权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

检测网络变化(wifi、2g、3g、4g)的更多相关文章

  1. iOS开发-Reachability实时检测Wifi,2G/3G/4G/网络状态

    最近遇到一个功能就是根据用户当前的网络状,用户未联网需要提示一下,如果是Wifi可以推荐一些图片新闻,如果是3G模式设置为无图的模式,获取网络状态比较简单,毕竟中国现在的流量还是一个比较贵的状态,哪天 ...

  2. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  3. 利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  4. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G) by徐文棋

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  5. android 获取网络类型名称2G 3G 4G wifi

    首先工程Manifest文件要引用: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ...

  6. iOS 中如何判断当前是2G/3G/4G/5G/WiFi

    5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了. 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如果判断的API.而在撸WebRTC音视频通 ...

  7. 判断是否联网_检测网络的类型为3G、2G、wap、wifi

    判断是否联网_检测网络的类型为3G.2G.wap.wifi  判断是否联网: /*** * judge Internet is available * * @author wei-spring * @ ...

  8. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  9. Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

随机推荐

  1. pytesser的使用

    pytesser以及其依赖插件下载地址:链接: http://pan.baidu.com/s/1i3zgpjJ 密码: ueyy 在学习Webdriver的过程中遇到验证码的识别问题,问了度娘知道了p ...

  2. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

  3. WebApi Gzip(Deflate) 压缩请求数据

    由于不能直接访问指定数据库,只能通过跳板机查询Oracle数据,所以要做一个数据中转接口, 查询数据就要压缩,于是就找资料,代码如下,其中要注意的是Response.Headers.Remove(&q ...

  4. 解决Maven中Missing artifact javax.jms:jms:jar:1.1:compile

    搭建好项目后报错: Missing artifact javax.jms:jms:jar:1.1:compile  于POM.xml中 解决方案: 一 :在nexus中配置一个代理仓库     地址为 ...

  5. 关于pcre正则表达式库libpcre

    gcc 4.8中已经包含了std regex的头文件 可是没有实现,所以链接是失败的 gcc 4.9完整的支持了c++ 11的regex. 在4.9以前,可以寻求boost的regex. 不过,我更熟 ...

  6. c++:参数型别的推导

    STL源码剖析--侯捷 总结 尽管现在的很多语言支持参数类型的判别,但是c/c++并不支持这一特性. 但是我们可以通过一些技巧使得c++具有自动判别参数类型的特性. 模板 我们都知道在模板类和模板函数 ...

  7. TF-IDF与余弦相似性的应用

    类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块.基于C语言的OTS库.以及基于classifier4J的C#实现和python实现.

  8. Linxu安装Lamp环境

    安装MySQL数据库 sudo apt-get install mysql-server mysql-client 下图为提示输入数据库密码,然后回车,之后还有提示,再重复输入一次,再回车 最后安装完 ...

  9. 【转】Ansys 13.0 flexlm not running完美解决方案

    http://jingyan.baidu.com/article/af9f5a2dd9843a43150a4550.html 实测,12.1 用此方法问题同样得解.

  10. 转:给C++初学者的50个忠告

                                                           转:给C++初学者的50个忠告 1.把C++当成一门新的语言学习(和C没啥关系!真的.): ...