Autorisations Bluetooth

Pour utiliser les fonctionnalités Bluetooth dans votre application, vous devez déclarer plusieurs autorisations. Vous devez également indiquer si votre application nécessite la prise en charge du Bluetooth classique ou du Bluetooth à basse consommation (BLE). Si votre application n'a pas besoin du Bluetooth classique ni du BLE, mais qu'elle peut tout de même bénéficier de ces technologies, vous pouvez vérifier la disponibilité au moment de l'exécution.

Déclarer des autorisations

L'ensemble d'autorisations que vous déclarez dans votre application dépend de la version du SDK cible de votre application.

Ciblez Android 12 ou version ultérieure

Remarque : Sur Android 8.0 (niveau d'API 26) et versions ultérieures, le gestionnaire d'appareils associés (CDM) fournit une méthode plus simple pour se connecter aux appareils associés, par rapport aux autorisations décrites dans cette section. Le système CDM fournit une UI d'association au nom de votre application et ne nécessite pas d'autorisations d'accéder à la position.

Si vous souhaitez mieux contrôler l'expérience d'association et de connexion, utilisez les autorisations décrites dans cette section.

Boîte de dialogue des autorisations Bluetooth
Boîte de dialogue des autorisations système, demandant à l'utilisateur d'autoriser une application à détecter les appareils à proximité, à les annoncer et à s'y connecter.

Si votre application cible Android 12 (niveau d'API 31) ou une version ultérieure, déclarez les autorisations suivantes dans le fichier manifeste de votre application:

  1. Si votre application recherche des appareils Bluetooth, tels que des périphériques BLE, déclarez l'autorisation BLUETOOTH_SCAN.
  2. Si votre application rend l'appareil actuel détectable par d'autres appareils Bluetooth, déclarez l'autorisation BLUETOOTH_ADVERTISE.
  3. Si votre application communique avec des appareils Bluetooth déjà associés, déclarez l'autorisation BLUETOOTH_CONNECT.
  4. Pour vos anciennes déclarations d'autorisation liées au Bluetooth, définissez android:maxSdkVersion sur 30. Cette étape de compatibilité de l'application permet au système de n'accorder à votre application que les autorisations Bluetooth dont elle a besoin lorsqu'elle est installée sur des appareils équipés d'Android 12 ou version ultérieure.
  5. Si votre application utilise les résultats de la recherche Bluetooth pour déduire la position physique, déclarez l'autorisation ACCESS_FINE_LOCATION. Sinon, vous pouvez affirmer avec force que votre application ne dérive pas de la position physique.

Les autorisations BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT et BLUETOOTH_SCAN sont des autorisations d'exécution. Par conséquent, vous devez explicitement demander l'approbation de l'utilisateur dans votre application avant de pouvoir rechercher des appareils Bluetooth, rendre un appareil visible par d'autres appareils ou communiquer avec des appareils Bluetooth déjà associés. Lorsque votre application demande au moins l'une de ces autorisations, le système invite l'utilisateur à autoriser votre application à accéder aux appareils à proximité, comme illustré dans la figure 1.

L'extrait de code suivant montre comment déclarer les autorisations liées au Bluetooth dans votre application si elle cible Android 12 ou une version ultérieure:

<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>

Affirmez clairement que votre application ne dérive pas de position géographique

Si votre application n'utilise pas les résultats de la recherche Bluetooth pour déduire la position physique, vous pouvez affirmer avec certitude qu'elle n'utilise jamais les autorisations Bluetooth pour déduire la position physique. Pour ce faire, procédez comme suit :

  1. Ajoutez l'attribut android:usesPermissionFlags à votre déclaration d'autorisation BLUETOOTH_SCAN et définissez sa valeur sur neverForLocation.

  2. Si la localisation n'est pas nécessaire pour votre application, supprimez l'autorisation ACCESS_FINE_LOCATION du fichier manifeste de votre application.

L'extrait de code suivant montre comment mettre à jour le fichier manifeste de votre application:

<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>

Ciblez Android 11 ou version antérieure

Si votre application cible Android 11 (niveau d'API 30) ou une version antérieure, déclarez les autorisations suivantes dans le fichier manifeste de votre application:

  • BLUETOOTH est nécessaire pour effectuer toute communication Bluetooth classique ou BLE, par exemple pour demander une connexion, accepter une connexion et transférer des données.
  • ACCESS_FINE_LOCATION est nécessaire, car sur Android 11 ou version antérieure, une analyse Bluetooth peut potentiellement être utilisée pour recueillir des informations sur la position de l'utilisateur.

Étant donné que les autorisations d'accéder à la position sont des autorisations d'exécution, vous devez les demander au moment de l'exécution et les déclarer dans votre fichier manifeste.

Détecter les appareils Bluetooth à proximité

Si vous souhaitez que votre application lance la détection d'appareils ou manipule les paramètres Bluetooth, vous devez déclarer l'autorisation BLUETOOTH_ADMIN. La plupart des applications n'ont besoin de cette autorisation que pour détecter les appareils Bluetooth locaux. N'utilisez pas les autres fonctionnalités accordées par cette autorisation, sauf si l'application est un "gestionnaire d'alimentation" qui modifie les paramètres Bluetooth à la demande de l'utilisateur. Déclarez l'autorisation dans le fichier manifeste de votre application. Exemple :

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

Si votre application est compatible avec un service et peut s'exécuter sur Android 10 (niveau d'API 29) ou Android 11, vous devez également déclarer l'autorisation ACCESS_BACKGROUND_LOCATION pour détecter les appareils Bluetooth. Pour en savoir plus sur cette exigence, consultez Accéder à la position en arrière-plan.

L'extrait de code suivant montre comment déclarer l'autorisation ACCESS_BACKGROUND_LOCATION:

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

Pour en savoir plus sur la déclaration des autorisations d'application, consultez la documentation de référence sur <uses-permission>.

Spécifier l'utilisation de la fonctionnalité Bluetooth

Si le Bluetooth est un élément essentiel de votre application, vous pouvez ajouter des indicateurs à votre fichier manifeste pour indiquer cette exigence. L'élément <uses-feature> vous permet de spécifier le type de matériel utilisé par votre application et si celui-ci est obligatoire ou non.

Cet exemple montre comment indiquer que le Bluetooth classique est requis pour votre application.

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

Si votre application repose sur la technologie Bluetooth Low Energy, vous pouvez utiliser les fonctionnalités suivantes:

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

Si vous indiquez que cette fonctionnalité est requise pour votre application, le Google Play Store la masquera pour les utilisateurs d'appareils qui ne disposent pas de ces fonctionnalités. Pour cette raison, vous ne devez définir l'attribut obligatoire sur true que si votre application ne peut pas fonctionner sans la fonctionnalité.

Vérifier la disponibilité des fonctionnalités au moment de l'exécution

Pour que votre application soit disponible pour les appareils qui ne sont pas compatibles avec le Bluetooth classique ou le BLE, vous devez toujours inclure l'élément <uses-feature> dans le fichier manifeste de votre application, mais définir required="false". Ensuite, au moment de l'exécution, vous pouvez déterminer la disponibilité des fonctionnalités à l'aide de 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);