Permisos de Bluetooth

Para usar las funciones de Bluetooth en tu app, debes declarar varios permisos. También debes especificar si tu app requiere compatible con Bluetooth clásico o Bluetooth de bajo consumo (BLE). Si el La app no requiere Bluetooth clásico o BLE, pero aún puede beneficiarse de los siguientes puedes verificar la disponibilidad en el entorno de ejecución.

Cómo declarar permisos

El conjunto de permisos que declares en tu app depende de la versión del SDK de destino de tu app.

Orientación a Android 12 o versiones posteriores

Nota: En Android 8.0 (nivel de API 26) y versiones posteriores, la Complementario El Administrador de dispositivos (CDM) ofrece un método más ágil para conectarse a en comparación con los permisos descritos en esta sección. El El sistema de CDM proporciona una IU de vinculación en nombre de tu app y no requiere permisos de ubicación.

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

Diálogo de permisos de Bluetooth
Diálogo de permisos del sistema, en el que se le solicita al usuario Otorgar permiso a una app para descubrir anuncios, publicar anuncios y conectarse a sitios cercanos dispositivos.

Si tu app se orienta a Android 12 (nivel de API 31) o versiones posteriores, declara los siguientes permisos en el archivo de manifiesto de tu app:

  1. Si tu app busca Bluetooth dispositivos, como los periféricos BLE, declara el BLUETOOTH_SCAN permiso.
  2. Si la app permite que el dispositivo actual sea detectable para otros dispositivos Bluetooth dispositivos, declarar BLUETOOTH_ADVERTISE permiso.
  3. Si la app se comunica con dispositivos Bluetooth ya vinculados, declara el permiso BLUETOOTH_CONNECT.
  4. Para las declaraciones heredadas de permiso que se relacionan con Bluetooth, configura android:maxSdkVersion en 30. Este paso de compatibilidad de la app ayuda al sistema Le otorgas a tu app solo los permisos de Bluetooth que necesita al instalarse dispositivos con Android 12 o versiones posteriores.
  5. Si la app usa los resultados de la búsqueda de Bluetooth para obtener la ubicación física, declara el permiso ACCESS_FINE_LOCATION. De lo contrario, puedes declarar con firmeza que tu app no ubicación física.

Los permisos BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT y BLUETOOTH_SCAN son permisos de tiempo de ejecución. Por lo tanto, debes solicitar explícitamente aprobación en tu app antes de buscar dispositivos Bluetooth, hacer que un dispositivo sea detectable para otros dispositivos o comunicarse con dispositivos Bluetooth ya sincronizados. Cuando tu app solicita al menos uno de estos permisos, el sistema le solicita al usuario que permita que tu app acceda Dispositivos cercanos, como se muestra en la figura 1

En el siguiente fragmento de código, se muestra cómo declarar permisos relacionados con Bluetooth en tu app si se orienta a Android 12 o versiones posteriores:

<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.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can
         <a href="#assert-never-for-location">strongly assert that your app
         doesn't derive physical location</a>. -->
    <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" />

    <!-- Needed only if your app uses Bluetooth scan results to derive physical location. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

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

Si la app no usa los resultados de la búsqueda de Bluetooth para obtener 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>
    <!-- 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" />

    <!-- 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. -->
    <strike><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></strike>
    ...
</manifest>

Orientación a Android 11 o versiones anteriores

Si tu app se orienta a Android 11 (nivel de API 30) o versiones anteriores, declara lo siguiente permisos en el archivo de manifiesto de tu app:

  • Se necesita BLUETOOTH para realizar cualquier comunicación Bluetooth clásica o BLE, como solicitar un conexión, aceptar una conexión y transferir datos.
  • ACCESS_FINE_LOCATION es necesario porque, en Android 11 y versiones anteriores, es posible que se use un escaneo de Bluetooth para recopilar información sobre la ubicación del usuario.

Debido a que los permisos de ubicación son permisos de tiempo de ejecución, debes solicitar estos permisos durante el tiempo de ejecución además de declararlos en tu manifiesto.

Cómo descubrir dispositivos Bluetooth locales

Si quieres que tu app inicie la detección de dispositivos o controle la conexión Bluetooth debes declarar el BLUETOOTH_ADMIN permiso. La mayoría de las apps necesitan este permiso solo para poder detectar dispositivos Bluetooth locales. No uses las otras habilidades que otorga este permiso, a menos que la aplicación sea un "administrador de energía" que modifica la configuración de Bluetooth a pedido del usuario. Declara el permiso en el archivo de manifiesto de tu app. Por ejemplo:

<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>

Si tu app admite un servicio y puede ejecutarse en Android 10 (nivel de API 29) o Android 11, también debes declarar el ACCESS_BACKGROUND_LOCATION permiso para detectar dispositivos Bluetooth. Para obtener más información consulta Acceso a la ubicación en la segundo plano.

En el siguiente fragmento de código, se muestra cómo declarar ACCESS_BACKGROUND_LOCATION permiso:

<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>

Consulta la <uses-permission> para obtener más información sobre cómo declarar permisos de la app.

Cómo especificar el uso de la función Bluetooth

Si Bluetooth es un elemento fundamental de tu app, puedes agregar marcas a tu archivo de manifiesto para indicar este requisito. El El elemento <uses-feature> permite te permite especificar el tipo de hardware que usa tu app y si es o no como en los productos necesarios.

En este ejemplo, se muestra cómo indicar que se requiere Bluetooth clásico para tu .

<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>

Si tu app depende de Bluetooth de bajo consumo, puedes usar lo siguiente:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

Si indicas que la función es necesaria para tu app, Google Play Store ocultar tu app a los usuarios que no tengan esas funciones Por este motivo, solo debes establecer el atributo obligatorio en true si la app no funciona sin la función.

Comprueba la disponibilidad de las funciones durante el tiempo de ejecución

Para que tu app esté disponible en dispositivos que no admiten la versión clásica de Bluetooth o BLE, debes incluir el elemento <uses-feature> en el archivo de Terraform, pero configura required="false". Luego, en el tiempo de ejecución, puedes determinar la disponibilidad de las funciones PackageManager.hasSystemFeature():

Kotlin

// Check to see if the Bluetooth classic feature is available.
val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)

// Check to see if the BLE feature is available.
val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

Java

// Use this check to determine whether Bluetooth classic is supported on the device.
// Then you can selectively disable BLE-related features.
boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);