Android WiFi扫描

Wifi扫描

Wifi scanning overview

权限方面

必须权限如下:

  • ACCESS_WIFI_STATE(用于扫描结束后读取wifi信息)
  • CHANGE_WIFI_STATE(用于扫描WiFi列表)

除必须权限外,根据系统版本,还有不同的限制。具体如下

Android 8.0 & 8.1

WifiManager.getScanResults() 方法的调用必须具备以下任一权限:

  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
  • CHANGE_WIFI_STATE

事实上,从6.0开始,WifiManager.getScanResults() 方法就需要定位权限了。见[硬件标识符访问权]

否则会抛异常SecurityException

Android 9.0

WifiManager.startScan() 方法的调用必须满足以下所有条件:

  • 拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限
  • 拥有 CHANGE_WIFI_STATE 权限
  • 打开定位服务

否则会抛异常SecurityException

Android Q & later
  • 在9.0版限制的基础上,对定位的要求升级为:必须拥有精确定位权限(ACCESS_FINE_LOCATION)

频率方面

Android对WifiManager.startScan()的调用频率进行了限制。对于超过此频率的接口访问,WifiManager 不会执行完整扫描,而是提供上次扫描所缓存的结果。

Android 8.0 & 8.1
  • 每个后台应用:1次/30分钟
Android 9.0 & later
  • 每个前台应用:4次/2分钟
  • 所有后台应用加起来:1次/30分钟

WiFi扫描的实现步骤

  1. 注册系统广播接收器,触发扫描动作【WifiManager.startScan()】
  2. 系统扫描结束后会发送广播,等待接收广播
  3. 收到广播后,获取扫描结果【WifiManager.getScanResults()】

扫描耗时统计

厂商机型系统扫描个数耗时(ms)
三星Note 35.0264034
三星Galaxy A76.0211111
三星S67.0392302
三星S78.051411
三星S8 plus9.0501467
谷歌Pixel 2 xlQ372233
魅族M5 Note6.0185576
魅族M157.1.2612480
华为荣耀 畅玩4X5.01305
华为MT7-TL106.0742531
华为Mate87.042232
华为荣耀V98.031238
华为畅享7S9.06605
OPPOR7s5.13960
OPPOR9S plus6.032636
OPPOR117.1.1461551
小米MI PAD 25.1664423
小米RedMi Note4x6.01705086
VIVOY51A5.01830
VIVOY55A6.091185
VIVOX97.1102802
VIVOY978.152668
VIVOX21i A9.0171181

平均值:2211

总结

wifi扫描有两个必须权限:

  • ACCESS_WIFI_STATE(用于扫描结束后读取wifi信息)
  • CHANGE_WIFI_STATE(用于扫描WiFi列表)

另外,随着Android系统的升级,对WiFi扫描做了越来越严格的限制。系统对 WifiManager.getScanResults()WifiManager.startScan() 所做的限制不太一样,但若要实现一个完整的WiFi扫描,就需要“扫描+获取”两个步骤,因此综合来看,WiFi扫描的行为变化如下:

6.0开始
  • 需要至少一个定位权限
8.0开始
  • 需要以下权限中至少一个:
    • ACCESS_FINE_LOCATION
    • ACCESS_COARSE_LOCATION
    • CHANGE_WIFI_STATE
9.0开始

需要同时满足以下所有条件:

  • 拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限
  • 拥有 CHANGE_WIFI_STATE 权限
  • 打开定位服务
Q开始
  • 在9.0版限制的基础上,对定位的要求升级为:必须拥有精确定位权限(ACCESS_FINE_LOCATION)

注意:以上是官方文档的说明,与实际测试的结果有出入,可能是手机厂商修改rom导致。

实际测试结果
  • 6.0开始,有如下要求:
    • 必须有至少一个定位权限(ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION)
      (Nexus7 6.0.1不开定位拿不到)
  • 7.1.1开始,有如下要求:
    • 必须有至少一个定位权限(ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION)
    • 必须有 CHANGE_WIFI_STATE 权限
    • 必须开启定位服务(魅族M15 、oppo A83)

(小米MIX2 8.0,三星N9600 8.1.0下,不开定位服务也能获取到WiFi列表)

  • Q开始,有如下要求:
    • 必须有精确定位权限(ACCESS_FINE_LOCATION)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未子涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值