即使没有活动网络,ConnectivityManager 也会返回 true

问题描述

我正在尝试检测是否有任何活动的互联网连接(WIFI 或移动互联网)。代码如下:

private boolean haveNetwork() {
        ConnectivityManager connMgr =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean flag=false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            for (Network network : connMgr.getAllNetworks()) {
                NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
                if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                    flag=true;
                    break;
                } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                    flag=true;
                    break;
                }
            }
        }
        Log.d("flag",String.valueOf(flag)); //returns true even if there's no internet connection
        return flag;
    }

正如标题所说,即使没有互联网连接,我的连接状态也始终保持真实

解决方法

您当前拥有的信息只会告诉您是否有 ConnectivityManager 跟踪的移动或 Wi-Fi 网络,而不是您是否已连接到该网络。

由于您似乎是同步执行此操作,因此您想使用这两种方法:

如果您想通过替换您的 for 循环同步调用 ConnectivityManager,您可以使用它。

Network activeNetwork = connMgr.getActiveNetwork();
if (null == activeNetwork) {
    return false;
}
NetworkCapabilities nc = connMgr.getNetworkCapabilities(activeNetwork);
return nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 
    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);