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 compatibilité avec le Bluetooth classique ou le 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.
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:
- Si votre application recherche des appareils Bluetooth, tels que des périphériques BLE, déclarez l'autorisation
BLUETOOTH_SCAN
. - Si votre application rend l'appareil actuel détectable par d'autres appareils Bluetooth, déclarez l'autorisation
BLUETOOTH_ADVERTISE
. - Si votre application communique avec des appareils Bluetooth déjà associés, déclarez l'autorisation
BLUETOOTH_CONNECT
. - Pour vos anciennes déclarations d'autorisation liées au Bluetooth, définissez
android:maxSdkVersion
sur30
. 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. - 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'autorisation de l'utilisateur dans votre application avant de pouvoir rechercher des appareils Bluetooth, rendre un appareil détectable 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 :
Ajoutez l'attribut
android:usesPermissionFlags
à votre déclaration d'autorisationBLUETOOTH_SCAN
et définissez sa valeur surneverForLocation
.Si la position 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écouverte d'appareils ou manipule les paramètres Bluetooth, vous devez déclarer l'autorisation BLUETOOTH_ADMIN
. La plupart des applications ont besoin de cette autorisation uniquement 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. 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 le 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 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 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);