【问题标题】:Application (WiFi connections) doesn't work anymore on Android 6.0 Marshmallow应用程序(WiFi 连接)在 Android 6.0 Marshmallow 上不再工作
【发布时间】:2016-04-22 16:58:51
【问题描述】:

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

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

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

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

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

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 的设备上运行

【问题讨论】:

  • 请提供minimal reproducible example。没有人可以帮助你处理看不见的代码。
  • @CommonsWare 对不起,我通常会这样做,但这次我不知道我还需要在这里发布什么?你到底需要什么代码?您还可以确认我正确理解了这个概念 - 我不会为此权限授予任何权限吗??
  • “我还需要在这里发布什么?” - 您可以发布“应该能够更改 WiFi 连接”的代码并确认“根本不做任何事情”的细节。 “我不应该为这个许可做任何许可吗?” -- 这是 Android 6.0 中的普通权限,因此您不需要为此做任何特别的事情。但是,其他事情发生了变化(例如,WifiManager.getScanResults() 需要位置权限,对 WifiConfiguration 的更改受限)。
  • 万一后面的更改可能与您的代码有关,这里是发行说明:developer.android.com/about/versions/marshmallow/…
  • 在安卓 6 中。您将获得 WiFi 状态的运行时权限..

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


【解决方案1】:

所以我最终在网上评论和阅读的人们的帮助下想通了。所以毕竟是权限问题。

似乎为了在从 Android 6.0 扫描 Connections 时与 WifiManager 一起工作,它需要访问您的位置,所以这是精细位置或粗略位置,我在我的清单文件中添加了以下内容:

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

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

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

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

【讨论】:

  • 只是添加到这个以防有人遇到这个答案。如果您需要先扫描以定位要连接的网络,则需要启用定位服务。我相信 Google 认为扫描和扫描结果是一个隐私问题,并增加了位置服务要求,因此用户可以控制授权。
【解决方案2】:

一个很好的教程建议:

*棉花糖上的应用需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限,并且应启用定位服务以获取 wifi 扫描结果

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

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

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多