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

startScan() in WifiManager deprecated in Android P

如何在没有 mWifimanager.startScan();

的情况下每 3 秒从 wifi 获取扫描结果

Google 说:

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

我认为在 API 级 P 中,他们计划将 startScan() 移动到不同的 class (WifiScanner),同时还有一些关键差异。

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

如果有替代解决方案,我也很想听听。

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

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

需要知道AP的X,Y位置才能准确定位,AP应该支持802.11mc的Fine Time Measurement。 Intel® Wireless-AC 9260 支持 802.11mc 并且一些 AP 开始支持 802.11mc 标准。

举几个例子:

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

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

希望我们能尽快听到消息,因为 RTT 仍然意味着您需要使用 ScanResult is80211mcResponder 扫描支持 802.11mc 的 AP,您在对 AP 执行 RTT 测距之前检查它。

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

来自WifiManager#EXTRA_RESULTS_UPDATED

Note: Apps holding android.Manifest.permission.NETWORK_SETTINGS permission are exempted from scan throttling.

注意:这是一个系统权限,如果没有生根并将应用程序移动到 'privileged' 位置或将其烘焙到自定义 ROM 中,普通应用程序无法使用它。

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

This method was deprecated in API level 28. The ability for apps to trigger scan requests will be removed in a future release. Check the documentation here.

我猜想 developers/users 至少在室内位置使用 WifiRttManager [1]。 或者依赖通常的 Google 播放位置服务,这在某些用例中是一个选项,但绝对不是全部。它针对一般用例进行了优化。没有用例是平均用例。

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

谁知道他们是否也会对此功能施加限制。 我很不高兴这个功能被从用户和开发人员手中夺走 - 它所需要的只是一个许可。

因此,在 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/