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

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

判断是否联网_检测网络的类型为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#

目录
相关文章
|
机器学习/深度学习 数据采集 算法
基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真
本项目基于Matlab2022a实现MQAM调制类型识别,使用MobileNet深度学习网络。完整程序运行效果无水印,核心代码含详细中文注释和操作视频。MQAM调制在无线通信中至关重要,MobileNet以其轻量化、高效性适合资源受限环境。通过数据预处理、网络训练与优化,确保高识别准确率并降低计算复杂度,为频谱监测、信号解调等提供支持。
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
存储 安全 物联网
计算机网络的类型
本文介绍了网络的分类,涵盖按覆盖范围(PAN、LAN、MAN、WAN)、使用场景(公网、外网、内网)、传输介质(有线、无线)、特殊类型(VLAN、SAN、网络桥接、接入网)及拓扑结构(总线型、星型、树型、环型、网状型)和交换方式(电路交换、报文交换、分组交换)等,详细阐述了各类网络的特点和技术。
2544 2
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
1059 5
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
516 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
380 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
376 10
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。