应用程序(WiFi连接)在Android 6.0 Marshmallow上不再起作用

时间:2016-04-22 16:58:51

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

我的应用程序在升级到Marshmallow后停止工作,应该可以更改WiFi连接,但现在它根本不做任何事情。

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

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

权限一直在Android Manifest中,如果我理解正确,它应该起作用,因为它是&#34;正常权限&#34;。那么为什么它不起作用,有人有解决方案吗?

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

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的设备上运行以来就存在该权限

2 个答案:

答案 0 :(得分:3)

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

为了在从Android 6.0扫描Connections时能够很好地使用WifiManager,它需要访问您的位置,因此无论是精确位置还是粗略位置,我都将以下内容添加到我的Manifest文件中:

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

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

最后,我做了一个工作,没有检查接入点是否可用,只是尝试使用try-catch语句来尝试连接它。这很难看,但这是新Android的唯一方法。

我确实喜欢这种新的权限模式,但显然Google在某些方面的实施工作非常糟糕。为什么现在需要打开位置才能获得WiFi扫描结果????没有任何意义,因为它在没有它的情况下在Android 6.0之前运行。我确实理解有关位置许可,但实际上必须打开位置才能扫描WiFi上的可用内容是完全错误的......

答案 1 :(得分:3)

优秀的辅导建议:

* Marshmallow上的App需要ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限,并且应启用位置服务以获取wifi扫描结果

您可以在以下网址了解更多相关信息: http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html

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