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:
- 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. - Si la app permite que otros dispositivos Bluetooth puedan detectar el dispositivo actual, agrega el permiso
BLUETOOTH_ADVERTISE
al manifiesto de la app. - Si la app se comunica con dispositivos Bluetooth ya vinculados, agrega el permiso
BLUETOOTH_CONNECT
al manifiesto de la app. - Para las declaraciones heredadas de permiso que se relacionan con Bluetooth, configura
android:maxSdkVersion
en30
. 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>
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:
Agrega el atributo
android:usesPermissionFlags
a la declaración de permisosBLUETOOTH_SCAN
y configura el valor de este atributo enneverForLocation
.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 sí 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>