Permisos nuevos de Bluetooth en Android 12

En Android 12, se introducen los permisos BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE y BLUETOOTH_CONNECT, que le permiten a la app buscar dispositivos cercanos sin necesidad de solicitar el permiso de ubicación. La app debe orientarse a Android 12 para declarar estos permisos.

Si deseas tener más control sobre la experiencia de vinculación y conexión, usa los permisos que se describen en esta página.

Declara permisos nuevos

Si la app interactúa con dispositivos Bluetooth, te recomendamos que hagas lo siguiente:

  1. Si la app busca dispositivos Bluetooth, como periféricos con Bluetooth de bajo consumo (BLE), agrega el permiso BLUETOOTH_SCAN al manifiesto de la app.
  2. Si la app permite que otros dispositivos Bluetooth puedan detectar el dispositivo actual, agrega el permiso BLUETOOTH_ADVERTISE al manifiesto de la app.
  3. Si la app se comunica con dispositivos Bluetooth ya vinculados, agrega el permiso BLUETOOTH_CONNECT al manifiesto de la app.
  4. Para las declaraciones heredadas de permiso que se relacionan con Bluetooth, configura android:maxSdkVersion en 30. Con este paso de compatibilidad de la app, se permite que el sistema le otorgue a esta solo los permisos de Bluetooth que necesita cuando se instala en dispositivos que ejecutan Android 12.

En el siguiente fragmento de código, se muestra cómo declarar estos permisos nuevos en la app:

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         You must add an attribute to this permission, or declare the
         ACCESS_FINE_LOCATION permission, depending on the results when you
         check location usage in your app. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    <!-- Needed only if your app makes the device discoverable to Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

    <!-- Needed only if your app communicates with already-paired Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    ...
</manifest>
Figura 1: Diálogo de permisos del sistema, que le solicita al usuario que otorgue un permiso de la app para detectar dispositivos cercanos, anunciarlos y conectarse a estos.

Diálogo para el usuario

Los permisos BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE y BLUETOOTH_CONNECT son permisos de tiempo de ejecución. Por lo tanto, debes solicitar la aprobación del usuario de manera explícita en la app antes de que puedas buscar dispositivos Bluetooth, permitir que otros dispositivos detecten uno o comunicarte con dispositivos Bluetooth ya vinculados.

Cuando la app solicita como mínimo uno de los permisos nuevos de Bluetooth, el sistema le solicita al usuario que permita que esta acceda a Dispositivos cercanos, como se muestra en la figura 1.

Considera cómo se usan los resultados de la búsqueda

Considera con detenimiento si la app usa los resultados de la búsqueda de Bluetooth para obtener la ubicación del dispositivo. Según la respuesta, completa los pasos de una de las siguientes secciones.

La app no obtiene la ubicación física

Si la app no obtiene la ubicación física, puedes afirmar con seguridad que la app nunca usa los permisos de Bluetooth para obtenerla. Para ello, completa los siguientes pasos:

  1. Agrega el atributo android:usesPermissionFlags a la declaración de permisos BLUETOOTH_SCAN y configura el valor de este atributo en neverForLocation.

  2. De lo contrario, si no se necesita otra ubicación para la app, quita el permiso ACCESS_FINE_LOCATION del manifiesto de esta.

En el siguiente fragmento de código, se muestra cómo actualizar el archivo de manifiesto de la app:

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Include "neverForLocation" only if you can strongly assert that
         your app never derives physical location from Bluetooth scan results. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Not needed if you can strongly assert that your app never derives
         physical location from Bluetooth scan results and doesn't need location
         access for any other purpose. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

La app obtiene la ubicación física

Si la app obtiene la ubicación física, debes declarar el permiso ACCESS_FINE_LOCATION en el manifiesto de esta, como se muestra en el siguiente fragmento de código:

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Required if your app derives physical location from Bluetooth
         scan results. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>