Android 9 功能和 API(一)-----------利用 Wi-Fi RTT 进行室内定位

Android9引入RTT API支持IEEE802.11mc Wi-Fi协议,即使未连接至接入点亦能测量距离,配合多点定位算法实现1-2米精度的室内定位,开启楼内导航、精细化位置服务等全新体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 9 添加了对 IEEE 802.11mc Wi-Fi 协议(也称为 Wi-Fi Round-Trip-Time (RTT))的平台支持,从而让您的应用可以利用室内定位功能。

在运行 Android 9 且具有硬件支持的设备上,应用可以使用 RTT API 来测量与附近支持 RTT 的 Wi-Fi 接入点 (AP) 的距离。 设备必须已启用位置服务并开启 Wi-Fi 扫描(在 Settings > Location 下),同时您的应用必须具有 ACCESS_FINE_LOCATION 权限。

设备无需连接到接入点即可使用 RTT。 为了保护隐私,只有手机可以确定与接入点的距离;接入点无此信息。

如果您的设备测量与 3 个或更多接入点的距离,您可以使用一个多点定位算法来预估与这些测量值最相符的设备位置。 结果通常精准至 1 至 2 米。

通过这种精确性,您可以打造新的体验,例如楼内导航、基于精细位置的服务,如无歧义语音控制(例如,“打开这盏灯”),以及基于位置的信息(如 “此产品是否有特别优惠?”)。

<think>我们正在讨论Android 13及以上版本中Wi-Fi权限位置权限的区别。 根据之前的回答,我们知道在Android 13(API 33)及以上版本中,Google引入了`NEARBY_WIFI_DEVICES`权限,以替代之前版本中用于Wi-Fi扫描等操作所需的`ACCESS_FINE_LOCATION`权限(精确定位权限)。 现在,用户明确询问这两者的区别,因此我们需要重点对比这两个权限的用途、使用场景以及背后的设计意图。 关键点: 1. 背景:在Android 13之前,应用要执行Wi-Fi扫描(例如,扫描附近的Wi-Fi网络)需要申请`ACCESS_FINE_LOCATION`权限,因为通过Wi-Fi扫描可以获取到附近Wi-Fi热点的信息,而这些信息可以用于推断设备的位置(例如,通过三角定位或与位置数据库匹配)。 2. Android 13的变更:为了给用户提供更好的隐私保护,Android 13将Wi-Fi相关的API访问权限与位置权限解耦。引入了`NEARBY_WIFI_DEVICES`权限,专门用于那些需要发现连接附近Wi-Fi设备但不需要知道设备位置的应用。 因此,我们可以从以下几个方面来区分: 、**权限目的** - `NEARBY_WIFI_DEVICES`:用于允许应用扫描连接附近的Wi-Fi设备(如智能家居设备、打印机等),而不涉及获取地理位置信息。 - `ACCESS_FINE_LOCATION`:用于允许应用获取设备的精确地理位置(例如,通过GPS、Wi-Fi、移动网络等)。 二、**适用场景** - `NEARBY_WIFI_DEVICES`:适用于以下操作: - 发现并连接附近的Wi-Fi设备(如Wi-Fi直连、Wi-Fi Aware)。 - 发起Wi-Fi扫描(`WifiManager.startScan()`)以发现可用的Wi-Fi网络(但注意:获取扫描结果中的SSID等信息也需要此权限,而以前需要位置权限)。 - 连接到Wi-Fi网络(通过指定网络配置)。 - 使用Wi-Fi RTT(Round-Trip-Time)进行测距(但注意:如果测距的目的是为了定位,则可能还需要位置权限)。 - `ACCESS_FINE_LOCATION`:适用于需要获取设备地理位置信息的场景,例如: - 地图导航 - 基于位置的服务(如附近的餐馆) - 位置记录(如跑步轨迹) 三、**隐私影响** - `NEARBY_WIFI_DEVICES`:设计初衷是让应用在不获取位置信息的前提下使用Wi-Fi功能。因此,应用可以通过声明`neverForLocation`标志来表明其不会将获取的Wi-Fi信息用于位置推断。 ```xml <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> ``` 这样,即使用户没有授予位置权限,应用也可以使用Wi-Fi设备发现连接功能- `ACCESS_FINE_LOCATION`:该权限直接涉及用户的位置隐私,用户对此更为敏感。应用在申请该权限时必须明确说明用途,并且用户可以选择拒绝。 四、**版本兼容性** - `NEARBY_WIFI_DEVICES`:仅适用于Android 13(API 33)及以上版本。对于较低版本,应用仍需申请`ACCESS_FINE_LOCATION`权限(以及可能还需要`ACCESS_COARSE_LOCATION`)来执行相同的Wi-Fi操作。 - `ACCESS_FINE_LOCATION`:适用于所有Android版本(自Android 6.0引入运行时权限以来)。 五、**权限申请方式** - 两者都是危险权限(dangerous permission),因此都需要在运行时动态申请(针对Android 6.0及以上设备)。 六、**关联性** - 即使应用申请了`NEARBY_WIFI_DEVICES`权限,如果它实际将获取的Wi-Fi信息用于位置推断,则必须同时申请`ACCESS_FINE_LOCATION`权限,并且不能使用`neverForLocation`标志。否则,可能会违反Google Play政策。 总结: | 维度 | `NEARBY_WIFI_DEVICES` | `ACCESS_FINE_LOCATION` | |--------------|-----------------------------------------------|------------------------------------------| | **主要用途** | 发现连接附近的Wi-Fi设备 | 获取设备的精确地理位置 | | **引入版本** | Android 13 (API 33) | Android 6.0 (API 23) | | **隐私影响** | 较低(通过声明`neverForLocation`避免位置访问) | 高(直接访问位置信息) | | **兼容处理** | 仅适用于API 33+,低版本需用位置权限替代 | 全版本适用 | | **典型场景** | 连接智能设备、Wi-Fi直连、打印 | 地图导航、位置服务、轨迹记录 | 通过以上对比,我们可以清晰地看到Android 13+中这两个权限的区别:`NEARBY_WIFI_DEVICES`是为了解耦Wi-Fi设备操作位置访问而新增的权限,让那些不需要位置信息的Wi-Fi操作可以独立进行,从而减少应用对位置权限的依赖,提升用户隐私保护。 相关问题: 根据用户的问题我们的回答,生成相关问题: 1. 如何在Android 13中同时使用Wi-Fi权限位置权限? 2. 如果应用在Android 13上只申请了`NEARBY_WIFI_DEVICES`权限而没有位置权限,能否获取到Wi-Fi的SSID列表? 3. 在Android 13中,使用Wi-Fi RTT测距功能需要哪些权限? 4. 如何为Android 13以下版本适配Wi-Fi扫描功能?</think>### Android 13+ Wi-Fi权限与位置权限的区别 在 Android 13(API 33)及以上版本中,Google 对 Wi-Fi 权限进行了重大调整,引入 `NEARBY_WIFI_DEVICES` 权限替代部分位置权限功能。核心区别如下: #### 1. **权限定位不同** | 权限类型 | 核心目的 | |-------------------------|----------------------------------| | **`NEARBY_WIFI_DEVICES`** | 专用于设备间通信(如连接 Wi-Fi 打印机、智能家居设备),不涉及地理位置推导[^1] | | **`ACCESS_FINE_LOCATION`** | 获取精确地理位置(GPS/Wi-Fi/基站三角定位),可直接用于位置追踪 | #### 2. **隐私影响差异** - `NEARBY_WIFI_DEVICES`: - 通过声明 `neverForLocation` 标志明确排除位置推导: ```xml <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> ``` - 用户授权后**无法获取经纬度坐标** - `ACCESS_FINE_LOCATION`: - 授权后应用可获取精确位置(误差 ≤ 10 米) - 用户敏感度更高,拒绝率更高[^2] #### 3. **技术实现区别** $$ \text{Wi-Fi扫描能力} = \begin{cases} \text{API < 33:} & \text{需位置权限} \\ \text{API ≥ 33:} & \text{需NEARBY\_WIFI\_DEVICES} \end{cases} $$ - **位置权限依赖**: - Android 12 及以下:Wi-Fi 扫描 (`WifiManager.startScan()`) 强制需要 `ACCESS_FINE_LOCATION` - Android 13+:相同操作只需 `NEARBY_WIFI_DEVICES`(除非需推导位置) #### 4. **使用场景对比** | 操作类型 | 所需权限 (Android 13+) | |------------------------|-------------------------------------| | 连接 Wi-Fi 打印机 | `NEARBY_WIFI_DEVICES` | | 智能家居设备配网 | `NEARBY_WIFI_DEVICES` | | Wi-Fi 直连 (P2P) | `NEARBY_WIFI_DEVICES` | | 获取用户地理位置 | `ACCESS_FINE_LOCATION` | | 基于 Wi-Fi室内定位 | `NEARBY_WIFI_DEVICES` + `ACCESS_FINE_LOCATION` | #### 5. **系统行为差异** - **权限申请界面**: - `NEARBY_WIFI_DEVICES`:显示“允许查找附近设备?” - `ACCESS_FINE_LOCATION`:显示“允许获取位置信息?” - **数据访问范围**: - `NEARBY_WIFI_DEVICES`:仅返回设备 MAC 地址信号强度 - `ACCESS_FINE_LOCATION`:可关联地理坐标数据库 > ⚠️ **关键提示**:即使使用 `NEARBY_WIFI_DEVICES`,若通过 Wi-Fi 信息推导位置(如将 BSSID 发送到位置服务 API),仍需申请位置权限[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值