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,看来会在新版本中修复。

https://code.google.com/p/android/issues/detail?id=192622

我认为它有帮助....需要进行一些更改... 您的应用程序并非每次都创建的 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 文件中添加权限...