检测WiFi网络无法进行身份验证

时间:2017-05-24 15:44:42

标签: android broadcastreceiver android-wifi

我正在尝试使用WiFiManager连接到WiFi网络。这是我用来执行此操作的代码:

WifiManager manager = [...];
WifiConfiguration config = new WifiConfiguration();
manager.setWifiEnabled(true);

//Set SSID, PSK, etc...
[...]

//Connect to the network
int netId = manager.addNetwork(config);
if (netId == -1)
{
    Toast.makeText(this, "Invalid PSK", Toast.LENGTH_LONG).show();
    return;
}
manager.enableNetwork(netId, true);
manager.saveConfiguration();

事先,我为BroadcastReceiver操作注册了WifiManager.NETWORK_STATE_CHANGED_ACTION。我通过检查给定DetailedState的{​​{1}}来尝试检测连接何时成功或失败(包括身份验证在内的各种原因)。

连接成功时一切正常,但由于某种原因,我的接收器没有被执行"连接失败时网络被添加到设备列表中,我可以通过进入WiFi设置看到它,但它不会尝试连接(或者它尝试连接但不通知我的接收器)。

有任何线索吗?谢谢!

2 个答案:

答案 0 :(得分:1)

如果连接状态成功,则enableNetwork方法返回true。 这在成功时工作正常,但不是检查失败状态的最佳方法(如果在第一步验证后连接失败,则返回true)。

我认为您可以在networkInfo对象中检查实际连接的网络,看看请求是否正常:

ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

答案 1 :(得分:0)

我终于成功实现了我想要的目标。

要检测连接是否成功,请注册WifiManager.NETWORK_STATE_CHANGED_ACTION广播意图并检查NetworkInfo.DetailedState.OBTAINING_IPADDR详细状态(显然是针对WiFi)。

要检测连接失败,请注册WifiManager.SUPPLICANT_STATE_CHANGED_ACTION广播意图,并检查是否有WifiManager.EXTRA_SUPPLICANT_ERROR个整数(通常为WifiManager.ERROR_AUTHENTICATING)。您可能需要获取Android隐藏API的访问权限才能实现此目的。