判断是否联网_检测网络的类型为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-10-06 00:16:49

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

Android如何检测网络的类型为3G、2G、wap、wifi

关于Android如何检测网络的类型,网上代码很多,但是有用的精品不多,前段时间,因为做项目需要涉及到具体网络类型的检查,特别是区分2G网络是为wap,还是net,类型,因为wap类型,需要配置代理上网,基于此,我将自己实现的过程代码记录下来: 1.定义常量来标识几种网络类型 /** 没有网络 */ public static final int NETWORKTYPE_INVALID = 0; /** wap网络 */ public static final int NETWORKTYPE_W

Unity如何判断网络连接类型

今天遇到了一个问题,如何判断手机游戏当前的网络连接类型,是wifi还是234G? 起初准备在Android中写好插件供Unity调用,后来在网上浏览众神的帖子时,在csdn上看到了使用NetworkReachability的使用方法,于是自己的安卓机完美解决,屌丝惜肾无爱疯,希望有人可以试试在ios上是否同样可用. 上代码: [code]csharpcode: using UnityEngine; using System.Collections; public class Test : Mon

Unity判断网络连接类型

使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G 1 using UnityEngine; 2 using System.Collections; 3 4 public class Test : MonoBehaviour { 5 6 string str; 7 // Use this for initialization 8 void Start () { 9 if (Application.internetReachability == Net

Android检测网络状态,判断当前网络是否可用

用户手机当前网络可用:WIFI.2G/3G网络,用户打开与不打开网络,和是否可以用是两码事.可以使用指的是:用户打开网络了并且可以连上互联网进行上网. 检测当前网络是否可用,代码如下: /** * 检测当的网络(WLAN.3G/2G)状态 * @param context Context * @return true 表示网络可用 */ public static boolean isNetworkAvailable(Context context) { ConnectivityManager

iphone判断当前网络连接类型

?Reachability只能区分出无网络.wifi和wwan(2G&2.5G&3G)类型的网络连接类型,只需重构networkStatusForFlags方法,即可详细区分出2G与3G网络 ??1. [代码][C/C++]代码     //Reachability.m 中 networkStatusForFlags 方法重构- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags{if ((fl

Android 判断当前网络连接类型

实际应用开发时,如果存在需要用户获取大量数据的情况,最好是先判断下网络类型,提示用户当前的网络类型,是否需要连接Wifi,etc.(手机流量太贵啦,当然土豪是无视这玩意的, (/ □ \)). 定义网络连接类型: public static final int NETTYPE_NULL = 0x00; //未连接网络 public static final int NETTYPE_WIFI = 0x01; //WIFI public static final int NETTYPE_MOBILE

iOS 判断当前是否连接到网络和网络类型

之前有判断过是否连接到网络,没有使用apple的示例中的Reachability. #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> #import <SystemConfiguration/SCNetworkReachability.h> -(BOOL)isConnectToNewtwork { struct sockaddr_in zeroAddress; bzero(

Android检测网络是否可用并获取网络类型

在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu instance; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.init(); instance=this; } //获取实例 public

iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G

如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Reachability都能做什么 检测3中网络环境 2G/3G wifi 无网络 如何使用通知 单个controller 多个controller 简单的功能: 仅在wifi下使用 Reachability简介 Reachablity 是一个iOS下检测,iOS设备网络环境用的库. 监视目标网络是否可