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 compatible avec les technologies Bluetooth classique et Bluetooth à basse consommation (BLE). Si votre ne nécessite pas les technologies Bluetooth Classic ni BLE, mais 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 appli dépend de la cible de celle-ci Version du SDK.

Cibler Android 12 ou version ultérieure

Remarque : Sur Android 8.0 (niveau d'API 26) ou version ultérieure, le Compagnon Le Gestionnaire d'appareils (CDM) permet de se connecter plus facilement 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 avoir plus de contrôle sur l'association et la 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 de autoriser une appli à découvrir des lieux à proximité, à faire de la publicité et à s'y connecter appareils.

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

  1. Si votre application recherche une connexion Bluetooth périphériques périphériques BLE, déclarez BLUETOOTH_SCAN l'autorisation.
  2. Si votre application détecte l'appareil actuel via d'autres appareils Bluetooth appareils, déclarez le BLUETOOTH_ADVERTISE l'autorisation.
  3. Si votre application communique avec des appareils Bluetooth déjà associés, déclarez l'autorisation BLUETOOTH_CONNECT.
  4. Pour les déclarations d'autorisations liées à l'ancien Bluetooth, définissez De android:maxSdkVersion à 30. Cette étape de compatibilité aide le système n'accordez à votre application que les autorisations Bluetooth dont elle a besoin lorsqu'elle est installée sur les 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 demander explicitement à l'utilisateur d'approbation dans votre application avant de pouvoir les appareils Bluetooth, rendre un appareil visible par d'autres appareils ou communiquer ; avec les appareils Bluetooth déjà associés. Lorsque votre application demande au moins l'une des le système invite l'utilisateur à autoriser votre application à accéder Appareils à proximité, comme illustré dans la figure 1.

L'extrait de code suivant montre comment déclarer la connexion Bluetooth autorisations 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 avec force que votre application ne détermine pas la position physique

Si votre application n'utilise pas les résultats de recherche Bluetooth pour déterminer la position géographique, vous peut affirmer avec certitude que votre appli n'utilise jamais les autorisations Bluetooth pour déterminer la situation géographique. 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 le Autorisation ACCESS_FINE_LOCATION du fichier manifeste de votre appli.

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 éléments suivants dans le fichier manifeste de votre application:

  • BLUETOOTH est nécessaire pour établir une communication Bluetooth classique ou BLE, comme demander un une connexion, l'acceptation d'une connexion et le transfert de données.
  • ACCESS_FINE_LOCATION est nécessaire, car, sur Android 11 ou version antérieure, une recherche Bluetooth qui pourraient servir à recueillir des informations sur l'emplacement 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écouvrir les appareils Bluetooth locaux

Si vous souhaitez que votre application lance la découverte d'appareils ou manipule les paramètres Bluetooth, vous devez déclarer l'autorisation BLUETOOTH_ADMIN. La plupart des applis ont besoin de cette autorisation uniquement pour détecter les périphériques 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 ACCESS_BACKGROUND_LOCATION l'autorisation de 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 la ACCESS_BACKGROUND_LOCATION autorisation:

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

Consultez le <uses-permission> pour en savoir plus sur la déclaration d'autorisations d'application.

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 indiquant cette exigence. La L'élément <uses-feature> permet de spécifier le type de matériel utilisé par votre application et s'il obligatoire.

Cet exemple montre comment indiquer que la technologie Bluetooth Classic est requise pour votre l'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 la fonctionnalité est requise pour votre application, le Google Play Store la masquera aux utilisateurs sur les appareils qui ne disposent pas de ces fonctionnalités. Pour cette raison, vous ne doit 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 rendre votre application disponible sur les appareils non compatibles avec la technologie Bluetooth Classic Avec BLE, vous devez toujours inclure l'élément <uses-feature> dans le fichier le fichier manifeste, mais définissez 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);