private void confirmToJoin(WifiConfiguration config, WifiManager.ActionListener saveListener,
WifiManager.ActionListener connectListener){
backupId =mWifiManager.getConnectionInfo().getNetworkId();
mDisableNetWorkId = backupId;
if(backupId != -1){
mWifiManager.disableNetwork(backupId);
}
if(config.preSharedKey != null){
Log.e(TAG, "security: PSK " + "ssid: " + config.SSID +" config.preSharedKey: " + config.preSharedKey);
}else if(config.wepKeys[0] != null){
Log.e(TAG, "security: WEP" + "ssid: " + config.SSID +" config.wepKeys[0]: " + config.wepKeys[0]);
}else {
Log.e(TAG, "security: NONE" + "ssid: " + config.SSID );
}
Utils.getInstance().removeWifi(mWifiManager, config.SSID.replace("\"", ""));
mWifiManager.save(config, saveListener);
mWifiManager.connect(config, connectListener);
mAccessPointSecurity = -1;
handler.sendEmptyMessage(2);
}
如果当前有已连接的网络,必须先断开,不能使用disconnect(),而要使用WifiManager#disableNetwork(networkId);
否则会自动重连回原来的网络。
使用enableNetwork()的方式去连接隐藏SSID无法成功,即使第二个参数disableOther为true;关于connect(config,connectListener)这个方法中的connectListener是在什么情况下回调onSuccesss的,
不得而知,无论密码是否正确,是否有这个ap,都会回调onSuccess()。估计是代表认证成功吧,因为如果使用WPA/WPA2的话,使用的认证方式是Open System Authentication,这种验证其实等同于没有验证,因为无论谁来验证都会被通过。所以即使密码错误也会回调onSuccess()。
调用disableNetwork()断开网络时,会触发一次CONNECTED的广播。感觉这是个系统bug。
使用disableNetwork()断开网络后,然后去连接另一个网络,如果连接失败后,不会重连会被disable的网络,这个方法
中有关于该特性的注释。
连接隐藏SSID时,在构造这个WifiConfiguration时也是需要小心谨慎,有点不对都会连接失败。
以下是连接NONE,WEP,PSK三种加密方式的WifiConfiguration构造:
private WifiConfiguration createAddNetworkConfig(){
WifiConfiguration config = new WifiConfiguration();
config.SSID = AccessPoint.convertToQuotedString(
mAddNetworkSsidEt.getText().toString());
config.hiddenSSID = true;
switch (mAccessPointSecurity) {
case AccessPoint.SECURITY_NONE:
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
break;
case AccessPoint.SECURITY_WEP:
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
if (mAddNetworkPasswordEt.length() != 0) {
int length = mAddNetworkPasswordEt.length(