Nuevo permiso de tiempo de ejecución para dispositivos de Wi-Fi cercanos

Android 13 (nivel de API 33) introduce el permiso de tiempo de ejecución NEARBY_WIFI_DEVICES, que forma parte del grupo de permisos NEARBY_DEVICES, para apps que administran las conexiones de un dispositivo a puntos de acceso cercanos a través de Wi-Fi. 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.

Si tu app se orienta a Android 13 y llama a varias API de Wi-Fi diferentes, debes obtener este nuevo permiso del usuario.

Casos de uso afectados

El nuevo permiso afecta a distintos casos de uso de Wi-Fi, incluidos los siguientes:

  • Buscar dispositivos cercanos, como impresoras o dispositivos de transmisión de contenido multimedia, o conectarse a ellos. Este flujo de trabajo permite que tu app realice este tipo de tareas:
    • Recibir información del punto de acceso fuera de banda, por ejemplo, a través de BLE.
    • Descubrir dispositivos y conectarse a estos a través de Wi-Fi Aware y Connect mediante un hotspot solo local.
    • Descubrir dispositivos y conectarse a estos a través de Wi-Fi Direct.
  • Iniciar una conexión a un SSID conocido, como un automóvil o un dispositivo de casa inteligente.
  • Iniciar un hotspot solo local.
  • Alcanzar dispositivos cercanos de Wi-Fi Aware.

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. Si la app solicita varios permisos en este grupo de permisos, el usuario ve un solo diálogo de tiempo de ejecución, en el que se 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, considera si tu app obtiene información de la ubicación de las API 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>

Mantener la compatibilidad con versiones anteriores

Como el permiso NEARBY_WIFI_DEVICES solo está disponible en Android 13 o versiones posteriores, debes conservar todas las declaraciones de ACCESS_FINE_LOCATION a fin de proporcionar retrocompatibilidad en tu app. Sin embargo, siempre que declares que tu app no utiliza las API de Wi-Fi para obtener la ubicación física, 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>

Ten en cuenta que algunas API todavía necesitan un permiso de ubicación

Varias API de Wi-Fi todavía necesitan el permiso ACCESS_FINE_LOCATION para acceder, del mismo modo que en la versión 12L y versiones anteriores. Los ejemplos incluyen los siguientes métodos de la clase WifiManager:

Verifica si hay API que necesiten el nuevo 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 la versión 12L o versiones anteriores. Ten en cuenta que dependes del permiso ACCESS_FINE_LOCATION.

Figura 1: Diagrama de flujo para determinar si una app que se orienta a la versión 12L o versiones anteriores 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 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 2: Diagrama de flujo para determinar si una app que se orienta a la versión 13 o versiones posteriores puede acceder a información de Wi-Fi.