Cómo solicitar permiso para acceder a dispositivos Wi-Fi cercanos

Las apps que se orientan a Android 13 (nivel de API 33) o versiones posteriores y administran conexiones Wi-Fi deben solicitar el permiso de tiempo de ejecución NEARBY_WIFI_DEVICES. Este permiso facilita la justificación del acceso de una app a dispositivos Wi-Fi cercanos; en versiones anteriores de Android, estas apps debían declarar el permiso ACCESS_FINE_LOCATION en su lugar.

El permiso forma parte del grupo de dispositivos cercanos

El permiso NEARBY_WIFI_DEVICES forma parte del grupo de permisos de dispositivos cercanos. Este grupo, que se agregó en Android 12 (nivel de API 31), también incluye permisos que se relacionan con Bluetooth y la banda ultraancha. Cuando solicitas cualquier combinación de permisos de este grupo de permisos, el sistema muestra un solo diálogo de tiempo de ejecución y le solicita al usuario que apruebe el acceso de la app a dispositivos cercanos. En la configuración del sistema, el usuario debe habilitar e inhabilitar los permisos de dispositivos cercanos como un grupo; por ejemplo, los usuarios no pueden inhabilitar el acceso a Wi-Fi, pero pueden mantener el acceso a Bluetooth habilitado para una app determinada.

Declara que la app no obtiene ubicación física

Cuando te orientes a Android 13 o versiones posteriores, considera si tu app obtiene información de la ubicación de las APIs de Wi-Fi; si no es así, debes declararlo. Para realizar esta aserción, establece el atributo usesPermissionFlags en neverForLocation en el archivo de manifiesto de tu app, como se muestra en el siguiente fragmento de código. Este proceso es similar al que realizas cuando declaras que la información del dispositivo Bluetooth nunca se usa para la ubicación:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

Las versiones anteriores y algunas APIs requieren el permiso de ubicación

Varias APIs de Wi-Fi requieren el permiso ACCESS_FINE_LOCATION, incluso cuando tu app se orienta a Android 13 o versiones posteriores. Los ejemplos incluyen los siguientes métodos de la clase WifiManager:

Además, como el permiso NEARBY_WIFI_DEVICES solo está disponible en Android 13 y versiones posteriores, debes conservar todas las declaraciones para ACCESS_FINE_LOCATION para proporcionar compatibilidad con versiones anteriores en tu app. Sin embargo, siempre que tu app no dependa de información de ubicación precisa, puedes establecer la versión máxima del SDK de este permiso en 32, como se muestra en el siguiente fragmento de código:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

Verifica si hay APIs que requieran el permiso

Si tu app se orienta a Android 13 o versiones posteriores, debes declarar el permiso NEARBY_WIFI_DEVICES para llamar a cualquiera de las siguientes API de Wi-Fi:

Flujos de trabajo del acceso a Wi-Fi

En la Figura 1, se muestra el flujo de trabajo de acceso a Wi-Fi en dispositivos que ejecutan Android 13 o versiones posteriores para apps que se orientan a Android 13 o versiones posteriores. Ten en cuenta que, siempre que declares que tu app no obtiene la ubicación física de la información del dispositivo de Wi-Fi, ya no es necesario declarar el permiso ACCESS_FINE_LOCATION:

Figura 1: Diagrama de flujo para determinar si una app que se orienta a Android 13 (nivel de API 33) o versiones posteriores puede acceder a información de Wi-Fi.

En la Figura 2, se muestra el flujo de trabajo de acceso a Wi-Fi en dispositivos que ejecutan la versión 12L o versiones anteriores. Ten en cuenta que dependes del permiso ACCESS_FINE_LOCATION.

Figura 2: Diagrama de flujo para determinar si una app que se orienta a la versión 12L (nivel de API 32) o versiones anteriores puede acceder a información de Wi-Fi.