面向 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
权限的依赖。