14

在我在模拟器上测试的应用程序中,我使用以下代码检查网络连接(WIFI):

    public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

即使我禁用了计算机的无线连接,此方法也总是返回true...这是由模拟器引起的还是其他原因?

如果这不是检查网络连接的正确方法,我该怎么做?

4

6 回答 6

37

最好 (1) 传入上下文,以便每个活动都可以调用此函数,以及 (2) 将此函数设为静态:

 public boolean isNetworkOnline() {
    boolean status=false;
    try{
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getNetworkInfo(0);
        if (netInfo != null && netInfo.getState()==NetworkInfo.State.CONNECTED) {
            status= true;
        }else {
            netInfo = cm.getNetworkInfo(1);
            if(netInfo!=null && netInfo.getState()==NetworkInfo.State.CONNECTED)
                status= true;
        }
    }catch(Exception e){
        e.printStackTrace();  
        return false;
    }
    return status;

    }  
于 2012-04-04T11:06:30.633 回答
7

要让 getActiveNetworkInfo() 工作,您需要将以下内容添加到清单中。

1. uses-permission android:name="android.permission.INTERNET"
 2. uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE"

最好使用 netInfo.isConnected() 而不是 netInfo.isConnectedOrConnecting

也试试这个

Context.getSystemService(Context.CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_MOBILE)

或者

Context.getSystemService(Context.CONNECTIVITY_SERVICE).requestRouteToHost(TYPE_WIFI, int hostAddress)
于 2012-04-04T11:15:26.107 回答
2

我们可以使用以下功能检查互联网连接的连接状态。Google Android 已更新 Android API 的功能以检查网络状态。现在在 Android 最新的 API 中,getAllNetworkInfo()已弃用。但getAllNetworks()函数只允许Build.VERSION.SDK_INT >= 21.I为所有情况编写代码。

要检查互联网连接,您可以调用此函数。

public static boolean checkInternetConnection(Context context) {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
        return false;
    } else if(Build.VERSION.SDK_INT >= 21){
        Network[] info = connectivity.getAllNetworks();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i] != null && connectivity.getNetworkInfo(info[i]).isConnected()) {
                    return true;
                }
            }
        }
    } else {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        final NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo();
        if (activeNetwork != null && activeNetwork.isConnected()) {
            return true;
        }
    }

    return false;
}
于 2017-08-03T09:53:32.853 回答
0

就我而言,我关闭了 Wifi,但忘记关闭数据/移动网络连接。一旦我这样做了,该线程的原始帖子中的代码就对我有用。

回顾一下:

  1. 前往设置
  2. 关闭 Wifi
  3. 转到设置-> 数据使用
  4. 关闭移动数据

设置

设置->数据使用

于 2015-10-22T17:41:12.030 回答
0

使用以下类,更新到可用的最新 Android 版本:Android 10。

于 2019-12-22T11:02:13.040 回答
-1

这就是我将它放在一个项目中的方式:

清单文件:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

静态功能:

public static boolean isNwConnected(Context context) {
    if (context == null) {
        return true;
    }
    ConnectivityManager connectivityManager = 
        (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo nwInfo = connectivityManager.getActiveNetworkInfo();
    if (nwInfo != null && nwInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}
于 2015-12-04T23:05:25.827 回答