【问题标题】:Android 6.0 Cannot add WifiConfiguration if there is already another WifiConfiguration for that SSID如果该 SSID 已有另一个 WifiConfiguration,则 Android 6.0 无法添加 WifiConfiguration
【发布时间】:2017-06-14 22:41:58
【问题描述】:

Android 6.0 对 WiFi 行为进行了一些更改,它破坏了我的应用行为并且找不到解决方案。

基本上,对于 Android 6.0,您不得修改或删除不是由您的应用创建的 WifiConfiguration 对象。这意味着我需要始终创建自己的 WifiConfiguration 对象。但是,如果用户或其他应用程序已经为特定 AP 制作了 WifiConfiguration,我无法为该 AP 创建另一个。

wifiManager.addNetwork(wifiConfiguration) 返回 -1。这适用于所有以前的 Android 版本,但不适用于 Android 6.0

所以我被困住了。这是Android错误吗?我想如果许多开发人员为具有自己的 WiFi 接入点的自定义硬件开发应用程序,他们应该会遭受这种痛苦。

【问题讨论】:

  • 认为这与这个错误code.google.com/p/android/issues/detail?id=199315 + 合并的有关
  • @Catalin,你是如何解决这个问题的?我们面临着完全相同的问题。 Android 的默认 wifi 扫描仪为我们的 wifi 网络创建了自己的 wifiConfiguration,因此现在我们的 App 无法再连接到它。我怎样才能重新控制自己的网络?

标签: android wifi android-wifi android-6.0-marshmallow


【解决方案1】:

是的。这是一个Android 6.0。错误,似乎将在新版本中修复。

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

【讨论】:

  • 不。 Android 团队似乎认为这种行为是正确的。
【解决方案2】:

我认为它有帮助....需要进行一些更改... 并非您的应用每次都创建的 WifiConfiguration 对象。该应用无权创建另一个对象...所以我们需要与以前存在的 netID 连接。

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 文件中添加权限...

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多