判断是否联网_检测网络的类型为3G、2G、wap、wifi
判断是否联网_检测网络的类型为3G、2G、wap、wifi
判断是否联网:
/***
* judge Internet is available
*
* @author wei-spring
* @return
*/
public boolean isHasNet() {
ConnectivityManager cwjManager = (ConnectivityManager) mActivity
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cwjManager.getActiveNetworkInfo() != null) {
return cwjManager.getActiveNetworkInfo().isAvailable();
} else {
return false;
}
}
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。
关于Android如何检测网络的类型,网上代码很多,但是有用的不多,真正解决了问题的我只找到一篇(见文章末尾网址),为了更好的方便自己理解,对这片文章做了解释和整理。
在android中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判断当前是否联网:
1
2
3
4
5
|
public static boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != 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并不是专门管理互联网连接的,还负责蓝牙等连接。
先定义一些整形变量代表不同的网络:
1
2
3
4
5
6
7
8
9
10
|
/** 没有网络 */ 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * 获取网络状态,wifi,wap,2g,3g. * * @param context 上下文 * @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@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; } else if (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; } return mNetWorkType; } |
其中为了区别是3g还是2g我们定义了isFastMobileNetwork(context)
方法,主要用到了TelephonyManager
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
private static boolean isFastMobileNetwork(Context context) { TelephonyManager telephonyManager = (TelephonyManager)context.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://blog.csdn.net/nanzhiwen666/article/details/8288433#
判断是否联网_检测网络的类型为3G、2G、wap、wifi的更多相关文章
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- Unity判断网络连接类型
使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G using UnityEngine; using System.Collections; public ...
- Unity如何判断网络连接类型
今天遇到了一个问题,如何判断手机游戏当前的网络连接类型,是wifi还是234G? 起初准备在Android中写好插件供Unity调用,后来在网上浏览众神的帖子时,在csdn上看到了使用NetworkR ...
- Android检测网络状态,判断当前网络是否可用
用户手机当前网络可用:WIFI.2G/3G网络,用户打开与不打开网络,和是否可以用是两码事.可以使用指的是:用户打开网络了并且可以连上互联网进行上网. 检测当前网络是否可用,代码如下: /** * 检 ...
- Android 判断当前网络连接类型
实际应用开发时,如果存在需要用户获取大量数据的情况,最好是先判断下网络类型,提示用户当前的网络类型,是否需要连接Wifi,etc.(手机流量太贵啦,当然土豪是无视这玩意的, (/ □ \)). 定义网 ...
- android判断网络的类型
转自:http://blog.csdn.net/xxxsz/article/details/8199031 判断网络类型是wifi,还是3G,还是2G网络 对不同的网络进行不同的处理,现将判断方法整理 ...
- Unity判断用户联网状态,WiFi/移动网络/无网络
Unity判断用户联网状态 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- iOS 检测网络状态 自动判断 认为提示网络改变
检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是让用户了解自己的网络状态,防止一些误会(比如怪应用无能)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验WIFI\3G ...
- Android检测网络是否可用并获取网络类型
在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...
随机推荐
- 结构体 + typedef
简单结构体 struct student{ char name[20]; //可以用scanf或者直接赋值 *如果用char *name 在用scanf时没有内存接收 long id; int ...
- POJ 2446 Chessboard
要求用占两格的长方形铺满平面上除去指定点 二分图匹配 #include <iostream> #include <cstdio> #include <cstring> ...
- C++程序设计实践指导1.8求指定范围内的所有素数改写要求实现
改写要求1:以指针为数据结构动态开辟存储空间 #include <cstdlib> #include <iostream> using namespace std; class ...
- 一种获取spring环境上下文方法:SpringContextUtil
获得spring里注册Bean的有好几种方法,这里介绍一种比较简单的方法: import org.springframework.beans.BeansException; import org.sp ...
- 移动网页版Meta 标签
viewport 大部分移动浏览器都接受,比如 Opera Mobile, iPhone, Android, Iris, IE, BlackBerry, Obigo, Firefox 最基本的例子,在 ...
- idea编译工程时出现Error:java: 无效的目标发行版: 1.8
见图,从上述可以看出工程用的jdk1.7,而idea编译时采用的是1.8版本(应该idea新版本内置的jre是1.8吧,默认编译采用1.8) 修改:如下图 http://blog.csdn.ne ...
- [Linux]shell编程基础/linux基础入门
声明执行程序 #!/bin/bash 用来告诉系统使用/bin/bash 程序来执行该脚本.譬如python 脚本,可以这样写: #!/usr/bin/python 赋值和引用 赋值公式: 变量名 ...
- hdu 1078 FatMouse and Cheese_记忆搜索
做这类型的搜索比较少,看懂题意花了半天 题意:给你个n*n的图,老鼠一次最远走k步,老鼠起初在(0,0),每次偷吃的东西必须比之前偷吃的要大. #include<iostream> #in ...
- SoftLAyer VPN
1,安装softlayer-VPN(即跑VPN客户端)的机器与在SoftLAyer中的HardwareHostServers or VMIServer的privateIP互通
- mac系统奔溃无法启动时,如何备份重要资料
虽然说苹果系统以稳定性获得高度好评,但是作为一名程序员,还是要考虑到系统奔溃的情况. 当遇到系统奔溃,无法启动,而我们还没有备份电脑里面的重要资料,这时候不用着急.可以用下面的 方法来拯救你的苹果电脑 ...