针对 Android 13(API 级别 33)或更高版本并管理 Wi-Fi 连接的应用应请求 NEARBY_WIFI_DEVICES
运行时权限。此权限使得更容易证明应用访问附近 Wi-Fi 设备的合理性;在之前的 Android 版本中,这些应用需要声明 ACCESS_FINE_LOCATION
权限。
权限是附近设备组的一部分
NEARBY_WIFI_DEVICES
权限是附近设备权限组的一部分。此组添加到 Android 12(API 级别 31)中,还包括与蓝牙和超宽带相关的权限。当您请求此权限组中的任何权限组合时,系统会显示单个运行时对话框,并要求用户批准您的应用访问附近设备。在系统设置中,用户必须作为一个组启用和禁用附近设备权限;例如,用户无法禁用 Wi-Fi 访问但仍保持给定应用的蓝牙访问启用状态。
强烈声明您的应用不会推导出物理位置
当您面向 Android 13 或更高版本时,请考虑您的应用是否会从 Wi-Fi API 推导出位置信息;如果不是,则应强烈声明这一点。要进行此声明,请在应用的清单文件中将 usesPermissionFlags
属性设置为 neverForLocation
,如下面的代码片段所示。此过程类似于您 声明蓝牙设备信息永远不会用于定位 时所做的操作。
<manifest ...> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <application ...> ... </application> </manifest>
以前的版本和某些 API 需要位置权限
即使您的应用面向 Android 13 或更高版本,某些 Wi-Fi API 也需要 ACCESS_FINE_LOCATION
权限。以下来自 WifiManager
类的示例方法:
此外,由于 NEARBY_WIFI_DEVICES
权限仅在 Android 13 和更高版本上可用,因此您应保留对 ACCESS_FINE_LOCATION
的任何声明以在您的应用中提供向后兼容性。但是,只要您的应用不依赖于 精确位置信息,您就可以将此权限的最大 SDK 版本设置为 32
,如下面的代码片段所示。
<manifest ...> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" /> <application ...> ... </application> </manifest>
检查需要权限的 API
如果您的应用面向 Android 13 或更高版本,则必须声明 NEARBY_WIFI_DEVICES
权限才能调用以下任何 Wi-Fi API:
WifiManager
WifiAwareManager
WifiAwareSession
WifiP2pManager
WifiRttManager
Wi-Fi访问流程
图1显示了在运行Android 13或更高版本的设备上,针对Android 13或更高版本的应用的Wi-Fi访问流程。请注意,只要您声明您的应用不会从Wi-Fi设备信息中获取物理位置,您就不再需要声明ACCESS_FINE_LOCATION
权限。
图2显示了在运行12L或更低版本的设备上的Wi-Fi访问流程。请注意其对ACCESS_FINE_LOCATION
权限的依赖。