请求访问附近的 Wi-Fi 设备权限

以 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:

Wi-Fi 访问工作流

图 1 显示了在运行 Android 13 或更高版本的设备上,以 Android 13 或更高版本为目标的应用的 Wi-Fi 访问工作流。请注意,只要您声明您的应用不会从 Wi-Fi 设备信息中推断出物理位置,您就不再需要声明 ACCESS_FINE_LOCATION 权限。

图 1. 用于确定以 Android 13(API 级别 33)或更高版本为目标的应用是否可以访问 Wi-Fi 信息的流程图。

图 2 显示了在运行 12L 或更低版本的设备上的 Wi-Fi 访问工作流。请注意对 ACCESS_FINE_LOCATION 权限的依赖。

图 2. 用于确定以 12L(API 级别 32)或更低版本为目标的应用是否可以访问 Wi-Fi 信息的流程图。