标签:
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在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判断移动网络的类型。
android如何判断当前网络类型(联网,2g,3g,wifi等)
标签:
原文地址:http://blog.csdn.net/jian_csdn/article/details/43307061