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

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

Wi-Fi 访问工作流

图 1 显示了运行 Android 13 或更高版本(适用于以 Android 13 或更高版本。请注意,只要您声明应用不会根据 Wi-Fi 设备信息推导物理位置信息,就不再需要声明 ACCESS_FINE_LOCATION 权限:

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

图 2 显示了运行 12L 或更低版本。请注意对 ACCESS_FINE_LOCATION 权限的依赖。

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