WifiManager 中的 startScan() 在 Android P 中已弃用

Posted

技术标签:

【中文标题】WifiManager 中的 startScan() 在 Android P 中已弃用【英文标题】:startScan() in WifiManager deprecated in Android P 【发布时间】:2018-08-17 02:42:54 【问题描述】:

如何从 wifi 获取扫描结果,例如每 3 秒,没有mWifimanager.startScan();

谷歌说:

startScan() This method was deprecated in API level P. The ability for apps to trigger scan requests will be removed in a future release.

注意我正在使用的这个 API 级别 List<ScanResult> results = mWifiManager.getScanResults(); 不调用 startScan ,列表包含 wifi AP,但更新非常慢

更新至 2019 年 1 月 12 日:https://issuetracker.google.com/issues/112688545

【问题讨论】:

您的目标是 26 岁以上吗? 这是谷歌的一个有意的小动作,也是将 android 转变为类似 ios 的封闭平台的逻辑延续,其中某些功能,如后台跟踪,保留给平台供应商自己的服务(其中记录使用它们来侵犯隐私) @oseiskar ,评论此报告支持WiFi扫描issuetracker.google.com/issues/112688545 【参考方案1】:

我猜其目的是让开发人员/用户使用 WifiRttManager 来代替至少室内定位 [1]。 或者依靠通常的 Google Play 定位服务,这在某些用例中是一种选择,但绝对不是全部。它针对一般用例进行了优化。没有用例是平均用例。

不幸的是,WifiRttManager 计算位置的方式要求 wifi 接入点具有 802.11mc。但是,您不需要连接到这些点。 今天几乎 0 个路由器有这个标准。 [2] [3] [4] 通过 3 个接入点,您可以获得接近 1-2m 精度的位置。

谁知道他们是否也会对此功能施加限制。 我很不高兴用户和开发者剥夺了这个功能——它只需要一个权限。

因此,在 802.11mc 流行之前,室内定位似乎将在未来几年进入黑暗时代。 也许一种解决方法是让您连接到设备并 ping 它们。

[1]https://developer.android.com/reference/android/net/wifi/rtt/WifiRttManager [2]https://github.com/Plinzen/android-rttmanager-sample

补充阅读 [3]https://en.wikipedia.org/wiki/IEEE_802.11mc [4]https://fit-iot.com/web/wifi-indoor-positioning/

【讨论】:

希望这会在最新的 Android Q (BETA) 中有所改变,我们都在等待这个改变!限制开发者使用这个工具太疯狂了……我们能做的就是等待。【参考方案2】:

Google 现在已经记录了 Android P 中 startScan() 函数的限制:

“我们正在进一步限制应用程序可以请求的扫描次数,以提高网络性能和延长电池寿命。

WifiManager.startScan() 的使用仅限于: - 每个前台应用程序限制为每 2 分钟扫描 4 次。 - 合并的所有后台应用程序被限制为每 30 分钟扫描一次。”

来源: https://issuetracker.google.com/issues/79906367

2018 年 8 月 8 日编辑:此处还添加了信息: https://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-throttling

【讨论】:

所以他们要删除它而不提供任何解决方法?我实际上正在为商业应用程序开发应用程序,他们依赖于在封闭环境中频繁的 wifi 扫描。安卓设备将不断连接到电源,所以这不是问题。该应用程序甚至不会出现在 Play 商店中。我认为他们应该为这类应用程序提供一种解决方法。也许是系统权限或类似的东西? 那么您应该为这些设备自定义 android 操作系统......即是实现它的唯一方法。 评论或支持此报告以支持 WiFi 扫描issuetracker.google.com/issues/112688545【参考方案3】:

来自WifiManager#EXTRA_RESULTS_UPDATED

注意:拥有 android.Manifest.permission.NETWORK_SETTINGS 权限的应用不受扫描限制。

注意:这是一个系统权限,普通应用程序无法使用它,除非生根并将应用程序移动到“特权”位置或将其烘焙到自定义 ROM 中。

【讨论】:

谷歌说:Permissions with the protection level signature, privileged or signatureOrSystem are only granted to system apps. If an app is a regular non-system app, it will never be able to use these permissions. 评论或支持此报告以支持 WiFi 扫描issuetracker.google.com/issues/112688545 @EAKTEAM 至少你可以在侧面加载的应用程序中拥有它。【参考方案4】:

我认为谷歌正计划限制应用程序扫描 wifi。

此方法在 API 级别 28 中已弃用。应用程序能够 触发扫描请求将在未来版本中删除。 Check the documentation here.

【讨论】:

是的,现在他们清楚地解释了......但也许会有任何更新来帮助开发人员使用更频繁的扫描......我们希望如此。 :) 评论或支持此报告以支持 WiFi 扫描issuetracker.google.com/issues/112688545【参考方案5】:

startScan() 在 P 上实际上有很多错误,因为我提出了 Google Issue 79906367。

我也不认为 WifiScanner 是替代品,因为它被标记为 SystemApi,这意味着应用程序无法访问...

希望我们很快就会听到,因为 RTT 仍然意味着您需要使用 ScanResult is80211mcResponder 扫描支持 802.11mc 的 AP,然后再对 AP 执行 RTT 测距。

【讨论】:

评论或支持此报告以支持 WiFi 扫描issuetracker.google.com/issues/112688545【参考方案6】:

StartScan() 方法在 Android P 中已弃用,来自 802.11mc 标准的新 RTT 协议必须与三边测量算法一起使用。 https://android-developers.googleblog.com/2018/03/previewing-android-p.html

需要知道 AP 的 X、Y 位置才能准确定位,并且 AP 应该支持 802.11mc 的精细时间测量。英特尔® Wireless-AC 9260 支持 802.11mc,一些 AP 开始支持 802.11mc 标准。

几个例子:

https://medium.com/@rafaelmiguel.ortega/android-p-first-taste-of-rtt-support-febefb679775 https://medium.com/@plinzen/perform-wifi-round-trip-time-measurements-with-android-p-9ffc5277ac6a

【讨论】:

评论或支持此报告以支持WiFi扫描issuetracker.google.com/issues/112688545【参考方案7】:

我认为在 API 级别 P 中,他们计划将 startScan() 移动到不同的类 (WifiScanner) 以及一些关键差异。

见:https://android.googlesource.com/platform/frameworks/base/+/android-p-preview-1/wifi/java/android/net/wifi/WifiScanner.java

如果有其他解决方案,我也很想听听。

目前,我可能只使用 startScan(),直到官方文档发布。

【讨论】:

评论或支持此报告以支持WiFi扫描issuetracker.google.com/issues/112688545

以上是关于WifiManager 中的 startScan() 在 Android P 中已弃用的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 WifiManager 类中的公共方法 setFrequencyBand

WifiManager:Android 5.0.2 中的频道连接丢失并重新启动

c_cpp tzapu WiFiManager中的自定义参数 - 来自https://github.com/tzapu/WiFiManager#custom-parameters

Android 6.0 上的低功耗蓝牙 startScan 找不到设备

字符串选择排序 C++

WifiManager类具体解释