应用程序(WiFi 连接)不再适用于 Android 6.0 Marshmallow

Application (WiFi connections) doesn't work anymore on Android 6.0 Marshmallow

我的应用程序在我升级到 Marshmallow 后停止工作,它应该能够更改 WiFi 连接,但现在它什么也没做。

我花了一些时间阅读 Android 6.0 的新权限模型。太棒了,但旧的应用程序应该继续工作......无论如何,我开始尝试实现权限的授予,但意识到这是一个正常的权限,如果它在 android 清单:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

许可一直在 Android 清单中,如果我理解正确,它应该可以工作,因为它是 "Normal permission"。那么为什么它不起作用,有人有解决方案吗?

添加与我的案例相关的代码片段:

protected void connectWifi() {
    if ((!connectedToAccessPoint(settings.getMainConnectionName()))
            && (accessPointIsAvailable(settings.getMainConnectionName()))) {
        ConnectionUtils.connectToWifi(this,
                settings.getMainConnectionName(),
                settings.getMainConnectionPassword());
        Toast.makeText(this,
                "Connecting to " + settings.getMainConnectionName(),
                Toast.LENGTH_LONG).show();
        handler.postDelayed(sendUpdatesToUI,
                DelayConstants.BASIC_REQUEST_SENT);
        handler.postDelayed(sendUpdatesToUI,
                DelayConstants.CHANGE_CONNECTION);
    }
}

这里是连接的技术部分:

public static void connectToWifi(Context context, String ssid, String password) {
     WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
     // setup a wifi configuration
      WifiConfiguration wc = new WifiConfiguration();
      wc.SSID = "\"" + ssid + "\"";
      wc.preSharedKey = "\""+ password + "\"";
      wc.status = WifiConfiguration.Status.ENABLED;
      wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
      wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
      wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
      wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
      wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
      wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    // connect to and enable the connection
     int netId = wifiManager.addNetwork(wc);
     wifiManager.enableNetwork(netId, true);
     wifiManager.setWifiEnabled(true);
}

在前面提到的 AndroidManifest 中有 CHANGE_WIFI_STATE 权限,因为该应用程序 运行 在没有 Android 6.0[=14= 的设备上]

所以我最终在网上评论和阅读的人们的帮助下弄明白了。所以这毕竟是一个权限问题。

似乎为了在从 Android 6.0 扫描连接时与 WifiManager 配合良好,它需要访问您的位置,所以这是精确位置或粗略位置,我将以下内容添加到我的清单文件:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

我在连接之前检查我的代码是否连接可用,这就是它永远无法工作的原因,它总是从网络扫描返回 0 个结果,因为缺少权限。因此,以标准方式,需要完成一个实现来请求 ACCESS_COARSE_LOCATION 权限,之后它将无法工作,除非您在 Android 中打开了您的位置设置。如果我每次都需要打开位置,它实际上会使我的应用程序变得毫无用处...

最后我做了一个解决方法,没有检查接入点是否可用,只是做了一个 try-catch 语句来尝试连接它。这很丑陋,但这是新 Android.

中的唯一方法

我确实喜欢新的权限模型,但显然 Google 在某些方面实施起来非常糟糕。为什么现在需要打开位置才能获取 WiFi 扫描结果????没有任何意义,因为它在 Android 6.0 之前没有它。我确实了解位置权限,但实际上必须打开位置才能扫描 WiFi 上可用的内容是完全错误的...

一个很好的教程建议:

*Marshmallow 上的应用程序需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限并且应启用位置服务才能获取 wifi 扫描结果

您可以在以下位置阅读更多相关信息: http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html

阅读有关从 Marshmallow 开始设置的限制是该应用程序只能修改它创建的那些 WiFi 网络。系统不允许修改其他应用程序或用户创建的网络。因此,如果网络已存在于列表中,添加网络可能会失败(系统可能会在检测到网络后自动连接到网络)。