以 Android 13(API 级别 33)或更高版本为目标平台且管理 Wi-Fi 连接的应用
应请求
NEARBY_WIFI_DEVICES
运行时权限。这个
权限,以便更轻松地证明应用访问附近的 Wi-Fi 设备的正当理由;
因此这些应用需要声明
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 需要位置信息权限
有些 Wi-Fi API 需要 ACCESS_FINE_LOCATION
权限,即使您的
应用以 Android 13 或更高版本为目标平台。示例包括:
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 设备信息推导物理位置信息,就不再需要声明 ACCESS_FINE_LOCATION
权限:
图 2 显示了运行
12L 或更低版本。请注意对 ACCESS_FINE_LOCATION
权限的依赖。