请求访问附近 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 访问但仍保持给定应用的蓝牙访问启用状态。

强烈声明您的应用不会推导出物理位置

当您面向 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信息的流程图。