安卓 获取wifi连接失败的原因

用广播监听可以得到wifi的连接状态
if (paramIntent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
Log.e("RefreshWifiState", "STATE_CHANGED");
NetworkInfo info = paramIntent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {
Log.e("RefreshWifiState", "DISCONNECTED");
} else if (info.getState().equals(NetworkInfo.State.CONNECTING)) {
Log.e("RefreshWifiState", "CONNECTING");
} else if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
Log.e("RefreshWifiState", "CONNECTED");

}
}

如果连接wifi输入了错误的密码,得到“DISCONNECTED”但是怎么得到连接wifi错误的原因呢?比如身份验证错误,或者是其他的一些原因。。

要得到连接wifi错误的原因,需要使用WifiManager的getScanResults()方法获取附近的wifi列表,然后遍历列表,找到连接失败的wifi的SSID,再通过WifiConfiguration.Status获取连接失败的原因。具体代码如下:

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> scanResults = wifiManager.getScanResults();
for (ScanResult scanResult : scanResults) {
    if (scanResult.SSID.equals(wifiSSID)) { // wifiSSID为连接失败的wifi的SSID
        List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
        for (WifiConfiguration config : configurations) {
            if (config.SSID.equals("\"" + wifiSSID + "\"")) {
                int status = config.status;
                if (status == WifiConfiguration.Status.DISABLED || status == WifiConfiguration.Status.DISABLED_BY_WIFI_MANAGER || status == WifiConfiguration.Status.FAILED) {
                    Log.e("WifiError", "Failed to connect to wifi. Reason: " + getWifiStatus(status));
                }
                break;
            }
        }
        break;
    }
}

private String getWifiStatus(int status) {
    switch (status) {
        case WifiConfiguration.Status.DISABLED:
            return "Disabled";
        case WifiConfiguration.Status.DISABLED_BY_WIFI_MANAGER:
            return "Disabled by WifiManager";
        case WifiConfiguration.Status.FAILED:
            return "Failed";
        default:
            return "Unknown";
    }
}