请求访问附近的 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信息的流程图。