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

时间: 2024-07-29 19:50:47

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

使用Reachability类判断iOS设备的当前网络连接类型_IOS

(1). 下载 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip (2). 拖reachability.h,reachability.m入工程 (库非ARC) ARC:-fno-objc-arc               (3) .导入SystemConfiguration.framework (4).用法 复制代码 代码如下: -(NSString*)getNetType   {

Android判断网络类型的方法(2g,3g还是wifi)_Android

本文实例讲述了Android判断网络类型的方法.分享给大家供大家参考,具体如下: 判断网络类型是wifi,还是3G,还是2G网络,对不同的网络进行不同的处理,现将判断方法整理给大家,以供参考 说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上没有电信的卡,所以没有验证,有电信手机的同事,可以验证一下,验证后将结果发送给大家. ConnectivityManager connectMgr = (ConnectivityManager) this .getSystem

PowerShell脚本实现检测网络内主机类型_PowerShell

最近一直在写一个自动检测网络内主机类型的脚本.基本功能可以实现判断主机操作系统类型,如果是域内的主机可以获取主机的硬件参数和性能参数,并判断是否存在网络设备.对一个运维人员来说往往需要尽快熟悉一个陌生的网络.所以这个脚本就很方便了,如果有更好的建议欢迎指正感谢! 复制代码 代码如下: ############################################ #Author:Lixiaosong #Email:lixiaosong8706@gmail.com #For:检测/24掩

Android中判断是否联网实现代码_Android

下面的方法返回false表示网络不通 // 检测网络 public static boolean checkNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } el

android 检测网络是否存在

在开发过程中,尤其是在开发网络应用的时候,时常要判断手机的联网状态,及时的给用户友善的提示.我们登录market,在网络断开的时候会及时的弹出警告窗口,避免用户盲目的等待. 这样的判断要贯穿在整个应用当中,在用户切换Activity,或者是后台service运行的时候都可能要用到.所以我们可以将判断的逻辑封装成一个方法,让其他Activity/service公用. public static boolean isNetworkAvailable( Activity mActivity ) { C

iOS开发网络篇—Reachability检测网络状态

前言:当应用程序需要访问网络的时候,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理.最好能监听设备的网络状态的改变,当设备网络状态连接.断开时,程序也应该有相应的处理. 开发工具:xcode6.3.2 操作系统:OS X Yosemite10.10.4 学习来源:<疯狂IOS讲义(下)>中的ios网络应用编程 1.下载,添加Reachability类. 官网下载网址: https://developer.apple.com/library/pr

通过JS和PHP两种方法判断用户请求时使用的浏览器类型_javascript技巧

在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko)

wcf-C#如何编写检测网络是否连接的windows服务?

问题描述 C#如何编写检测网络是否连接的windows服务? 如题,本人没有做过windows服务编程,也是C#新手,最近想做一个检测网络连接状态的服务,如果网络已连接,就启动本机一个指定的程序?请教下这个功能如何实现,最好能有代码 解决方案 win32 API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved); 参数lpdwF

PHP+Ajax 检测网络是否正常实例详解_php技巧

本文实例讲述了PHP+Ajax实时自动检测是否联网的方法.分享给大家供大家参考.具体实现方法如下: html部分代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xht