以 Android 13(API 级别 33)或更高版本为目标的应用以及管理 Wi-Fi 连接的应用,应请求 NEARBY_WIFI_DEVICES
运行时权限。此权限可更方便地说明应用访问附近 Wi-Fi 设备的必要性;在之前的 Android 版本中,这些应用需要声明 ACCESS_FINE_LOCATION
权限。
权限是附近设备组的一部分
NEARBY_WIFI_DEVICES
权限是 附近设备 权限组的一部分。该组在 Android 12(API 级别 31)中添加,还包括与蓝牙和超宽带相关的权限。当您请求此权限组中的任何权限组合时,系统会显示一个运行时对话框,请求用户批准您的应用访问附近的设备。在系统设置中,用户必须作为一个组启用和禁用 附近设备 权限;例如,用户无法针对给定应用禁用 Wi-Fi 访问权限但保持蓝牙访问权限启用。
强烈声明您的应用不会从 Wi-Fi API 推断出物理位置
以 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
权限的依赖。