Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序(WiFi连接)不';安卓6.0棉花糖不再适用_Android_Permissions_Android Wifi_Android 6.0 Marshmallow_Android Permissions - Fatal编程技术网

Android 应用程序(WiFi连接)不';安卓6.0棉花糖不再适用

Android 应用程序(WiFi连接)不';安卓6.0棉花糖不再适用,android,permissions,android-wifi,android-6.0-marshmallow,android-permissions,Android,Permissions,Android Wifi,Android 6.0 Marshmallow,Android Permissions,一旦我升级到棉花糖,我的应用程序就停止工作了,它本来应该可以改变WiFi连接,但现在它什么都不做 我花了一些时间阅读了Android 6.0的新权限模型。好吧,太棒了,但旧的应用程序应该继续工作。。。无论如何,我开始尝试实现权限授予,但意识到这是一个正常的权限,如果在android manifest中定义了,则不应该对其执行任何权限请求: <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

一旦我升级到棉花糖,我的应用程序就停止工作了,它本来应该可以改变WiFi连接,但现在它什么都不做

我花了一些时间阅读了Android 6.0的新权限模型。好吧,太棒了,但旧的应用程序应该继续工作。。。无论如何,我开始尝试实现权限授予,但意识到这是一个正常的权限,如果在android manifest中定义了,则不应该对其执行任何权限请求:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
这里是连接的技术部分:

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中,如前所述,存在更改WIFI状态权限,这是因为该应用程序在没有Android 6.0的设备上运行,所以我最终在网上评论和阅读的人的帮助下找到了答案。所以这毕竟是一个权限问题

在扫描Android 6.0连接时,为了与WifiManager配合良好,它需要访问您的位置,因此,无论是精细位置还是粗略位置,我在清单文件中添加了以下内容:

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

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

最后,我做了一个变通,没有检查访问点是否可用,只是做了一个try-catch语句来尝试连接到它。这很难看,但这是新安卓系统中的唯一方法


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

一个极好的教程建议:

*棉花糖上的应用程序需要访问\u粗略\u位置或访问\u精细\u位置权限,并且应启用位置服务以获取wifi扫描结果

您可以通过以下网址了解更多信息:


了解到从棉花糖开始设置的限制是,该应用程序只能修改其创建的WiFi网络。系统不允许修改其他应用程序或用户创建的网络。因此,如果列表中已经存在网络,则添加网络可能会失败(一旦检测到网络,系统可能会自动连接到网络)。

请提供一个解决方案。没有人能帮你处理看不见的代码。@commonware抱歉,我通常会这样做,但这次我不知道我还需要在这里发布什么?你到底需要什么代码?另外,您能否确认我正确理解了这个概念?我不会为此权限授予任何权限??“我还需要在此处发布什么?”--您可以发布“应该能够更改WiFi连接”的代码,并确认“根本不做任何事”的细节。“我不会为此权限授予任何权限?”——这是安卓6.0中的正常权限,因此您不需要为此做任何特殊的操作。但是,其他方面已经发生了变化(例如,
WifiManager.getScanResults()
需要位置权限,限制对
WifiConfiguration
的更改)。由于后者可能与您的代码有关,以下是安卓6中的发行说明。您将获得WiFi状态的运行时权限。如果有人遇到此答案,只需添加此权限即可。如果需要先扫描以定位要连接的网络,则需要启用位置服务。我相信谷歌认为扫描和扫描结果是一个隐私问题,并增加了位置服务要求,因此用户可以控制格兰特。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />