Android 6.0 如果该 SSID 已经有另一个 WifiConfiguration,则无法添加 WifiConfiguration
Android 6.0 Cannot add WifiConfiguration if there is already another WifiConfiguration for that SSID
Android 6.0 对 WiFi 行为进行了一些更改,它破坏了我的应用程序行为并且找不到解决方案。
基本上,对于 Android 6.0,您不能修改或删除不是由您的应用创建的 WifiConfiguration 对象。这意味着我需要始终创建自己的 WifiConfiguration 对象。但是,如果用户或其他应用程序已经为特定 AP 创建了 WifiConfiguration,则我无法为该 AP 创建另一个。
wifiManager.addNetwork(wifi 配置)returns -1。这适用于所有以前的 Android 版本,但不适用于 Android 6.0
所以我卡住了。这是 Android 错误吗?我想如果很多开发人员为具有自己的 WiFi 接入点的自定义硬件开发应用程序,他们应该会遇到这种情况。
是的。这是 Android 6.0。 bug,看来会在新版本中修复。
我认为它有帮助....需要进行一些更改...
您的应用程序并非每次都创建的 WifiConfiguration 对象。该应用程序没有创建另一个对象的权限...因此我们需要连接到以前存在的网络 ID。
public void connectToWifi(){
try{
WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wc.SSID = "\"NETWORK_NAME\"";
wc.preSharedKey = "\"PASSWORD\"";
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiManager.setWifiEnabled(true);
int netId = wifiManager.addNetwork(wc);
if (netId == -1) {
netId = getExistingNetworkId(SSID);
}
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
private int getExistingNetworkId(String SSID) {
WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
if (configuredNetworks != null) {
for (WifiConfiguration existingConfig : configuredNetworks) {
if (existingConfig.SSID.equals(SSID)) {
return existingConfig.networkId;
}
}
}
return -1;
}
并在 Manifest 文件中添加权限...
Android 6.0 对 WiFi 行为进行了一些更改,它破坏了我的应用程序行为并且找不到解决方案。
基本上,对于 Android 6.0,您不能修改或删除不是由您的应用创建的 WifiConfiguration 对象。这意味着我需要始终创建自己的 WifiConfiguration 对象。但是,如果用户或其他应用程序已经为特定 AP 创建了 WifiConfiguration,则我无法为该 AP 创建另一个。
wifiManager.addNetwork(wifi 配置)returns -1。这适用于所有以前的 Android 版本,但不适用于 Android 6.0
所以我卡住了。这是 Android 错误吗?我想如果很多开发人员为具有自己的 WiFi 接入点的自定义硬件开发应用程序,他们应该会遇到这种情况。
是的。这是 Android 6.0。 bug,看来会在新版本中修复。
我认为它有帮助....需要进行一些更改... 您的应用程序并非每次都创建的 WifiConfiguration 对象。该应用程序没有创建另一个对象的权限...因此我们需要连接到以前存在的网络 ID。
public void connectToWifi(){
try{
WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wc.SSID = "\"NETWORK_NAME\"";
wc.preSharedKey = "\"PASSWORD\"";
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiManager.setWifiEnabled(true);
int netId = wifiManager.addNetwork(wc);
if (netId == -1) {
netId = getExistingNetworkId(SSID);
}
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
private int getExistingNetworkId(String SSID) {
WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
if (configuredNetworks != null) {
for (WifiConfiguration existingConfig : configuredNetworks) {
if (existingConfig.SSID.equals(SSID)) {
return existingConfig.networkId;
}
}
}
return -1;
}
并在 Manifest 文件中添加权限...