Android 6.0 检查是否连接到 Wi-Fi(没有互联网)

Android 6.0 check if connected to a Wi-Fi (without Internet)

检查 Android 设备是否连接到 Wi-Fi 网络的方法如下:

NetworkInfo info = ((ConnectivityManager) ctx.getSystemService(Context
         .CONNECTIVITY_SERVICE)).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
boolean isWifiConnected = info != null && info.isAvailable() && info.isConnected();

这适用于 Android 6.0 之前的所有版本。 但是,在 Android 6.0 上,如果设备连接到 Wi-Fi 而无法访问互联网,info.isConnected() returns false。

那么,我如何确定设备已连接到 Android 6.0 上的 Wi-Fi?

我也有同样的问题。您可以检查是否有SSID,这意味着连接:

WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.getConnectionInfo() != null) {
    String ssid = wifiManager.getConnectionInfo().getSSID();
}

系统正在将流量路由到小区连接,因此 OS 报告 Wi-Fi 网络已断开连接。 Android 6.0 更改了底层路由逻辑以避免没有互联网的 Wi-Fi 连接。这就是为什么 connectivityManager.getActiveNetworkInfo() 不再 returns Wi-Fi 连接 NetworkInfo w/o 互联网(如果有活动的蜂窝数据连接)。

似乎 ConnectivityManager.bindProcessToNetwork(网络网络)是您告诉 OS 喜欢一个网络而不是另一个网络的方式。

对于 Android 5.0 及更高版本,您需要使用不同的 API 来检查设备是否已连接到 WiFi 网络。该设备还可能同时连接到移动网络。

ConnectivityManager connectivityManager = ((ConnectivityManager) ctx.getSystemService
                (Context.CONNECTIVITY_SERVICE));
        boolean isWifiConnected = false;
        Network[] networks = connectivityManager.getAllNetworks();
        if (networks == null) {
            isWifiConnected = false;
        } else {
            for (Network network : networks) {
                NetworkInfo info = connectivityManager.getNetworkInfo(network);
                if (info != null && info.getType() == ConnectivityManager.TYPE_WIFI) {
                    if (info.isAvailable() && info.isConnected()) {
                        isWifiConnected = true;
                        break;
                    }
                }
            }
        }
        return isWifiConnected;