Autorisations Bluetooth

Pour utiliser les fonctionnalités Bluetooth dans votre application, vous devez déclarer plusieurs autorisations. Vous devez également spécifier si votre application nécessite la prise en charge de la technologie Bluetooth classique ou Bluetooth à basse consommation (BLE). Si votre application ne nécessite pas la technologie Bluetooth classique ou 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 des autorisations que vous déclarez dans votre application dépend de la version du SDK cible de votre application.

Cibler Android 12 ou version ultérieure

Remarque : Sur Android 8.0 (niveau d'API 26) ou version ultérieure, Companion Device Manager (CDM) offre une méthode de connexion simplifiée aux appareils associés, par rapport aux autorisations décrites dans cette section. Le système CDM fournit une UI d'association pour le compte 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é, à en faire la publicité 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 visible 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'autorisations liées au Bluetooth, définissez android:maxSdkVersion sur 30. Cette étape de compatibilité des applications 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 des résultats de recherche Bluetooth pour déterminer la position physique, déclarez l'autorisation ACCESS_FINE_LOCATION. Sinon, vous pouvez affirmer fortement que votre application ne obtient pas la position physique.

Les autorisations BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT et BLUETOOTH_SCAN sont des autorisations d'exécution. Par conséquent, vous devez demander explicitement 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 à l'autoriser à accéder aux appareils à proximité, comme illustré dans la figure 1.

L'extrait de code suivant montre comment déclarer des 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 fortement que votre application ne tire pas la position géographique

Si votre application n'utilise pas les résultats de recherche Bluetooth pour obtenir la position physique, vous pouvez confirmer que votre application n'utilise jamais les autorisations Bluetooth pour obtenir la position physique. Pour ce faire, procédez comme suit :

  1. Ajoutez l'attribut android:usesPermissionFlags à la déclaration d'autorisation BLUETOOTH_SCAN et définissez la valeur de cet attribut 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>

Cibler 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 des communications Bluetooth classiques ou BLE, telles que la demande de connexion, l'acceptation d'une connexion et le transfert de données.
  • ACCESS_FINE_LOCATION est nécessaire, car sous Android 11 ou version antérieure, une analyse Bluetooth peut potentiellement être utilisée pour recueillir des informations sur la position de l'utilisateur.

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

Découvrir les appareils Bluetooth locaux

Si vous souhaitez que votre application lance la découverte de l'appareil 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 pouvoir 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. Par exemple :

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

Si votre application prend en charge un service et peut s'exécuter sous 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 à ce sujet, consultez Accéder aux données de localisation 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 d'autorisations d'applications, consultez la documentation de référence sur <uses-permission>.

Spécifier l'utilisation des fonctionnalités 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 s'il est requis ou non.

Cet exemple montre comment indiquer que la technologie Bluetooth classique est requise pour votre application.

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

Si votre application repose sur la technologie Bluetooth à basse consommation, vous pouvez utiliser les éléments suivants:

<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 cette fonctionnalité.

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

Pour que votre application soit disponible sur les appareils qui ne sont pas compatibles avec la technologie Bluetooth classique ou BLE, vous devez tout de même 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);