博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断是否联网_检测网络的类型为3G、2G、wap、wifi
阅读量:7137 次
发布时间:2019-06-28

本文共 4583 字,大约阅读时间需要 15 分钟。

判断是否联网_检测网络的类型为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://lrprl.baihongyu.com/

你可能感兴趣的文章
mongoDB - 安装
查看>>
xp安装maven
查看>>
(转)sscanf函数的用法
查看>>
30个高质量的免费jquery滑块PSD文件
查看>>
hdu1686(kmp)
查看>>
【web前端面试题整理05】做几道前端面试题休息休息吧
查看>>
SQL查询的几种方式
查看>>
悉尼农历节精彩贺岁活动准备就绪
查看>>
Facebook拟投资10亿美元在弗吉尼亚州打造数据中心
查看>>
图片基础知识梳理(1) ImageView 的 ScaleType 属性解析
查看>>
理解索引:MySQL执行计划详细介绍
查看>>
滑动冲突
查看>>
Ubuntu Linux 中虚拟主机的配置 - 搭配 Nginx
查看>>
1024程序员节最新福利之2018最全Android资料集合
查看>>
源码阅读:SDWebImage(七)——SDWebImageImageIOCoder
查看>>
App 启动优化 之 背景知识
查看>>
检测不同服务器上代码差别的shell的脚本
查看>>
JavaScript的循环方式(1)
查看>>
扎克伯格扎心,传谷歌搜索将接受审查重新进入中国
查看>>
Confluence 6 添加或删除用户组
查看>>