Après la mise à niveau vers Android version 6.0, le balayage Bluetooth Low Energy (BLE) ne fonctionnera que si les services de localisation sont activés sur le périphérique. Voir ici pour référence: Bluetooth Low Energy startScan sur Android 6.0 ne trouve pas de périphériques
En gros, vous devez activer l'autorisation pour l'application et pour le téléphone. Est-ce un bug? Est-il possible d'analyser sans que les services de localisation ne soient réellement activés? Je ne veux pas avoir d'emplacement pour toutes mes applications.
EDIT J'ai omis de mentionner que j'utilise la méthode startScan()
dans BluetoothLeScanner
fournie dans l'API 21. Je suis d'accord avec les autorisations de parcours et de fin dans le manifeste requis par cette méthode. Je ne veux tout simplement pas que les utilisateurs de mon application soient obligés d'activer les services de localisation sur leur appareil (GPS, etc.) pour pouvoir utiliser mon application.
Auparavant, la méthode startScan()
était exécutée et renvoyait les résultats avec les services de localisation désactivés sur le téléphone. Sur Marshmallow, toutefois, la même application "analysait" mais échouait en silence et ne renvoyait aucun résultat lorsque les services de localisation n'étaient pas activés sur le téléphone et que les autorisations de parcours/localisation précise étaient toujours dans le manifeste.
Non, ce n'est pas un bug.
Ce problème a été signalé à Google, où ils ont répondu que c'était le comportement souhaité et qu'ils ne le corrigeraient pas. Ils ont dirigé les développeurs vers ce site où il indique que la permission d’emplacement est maintenant nécessaire pour l’accès aux identifiants matériels. Il incombe maintenant au développeur de sensibiliser ses utilisateurs à cette exigence.
Dans le numéro, cependant, il ne dit pas pourquoi les services de localisation (GPS, etc.) sont nécessaires et il ne semble pas qu'ils vont revenir sur le problème pour l'expliquer, car il a été marqué comme le comportement souhaité.
Pour répondre à la deuxième partie de la question: Oui, il est possible de numériser sans activer les services de localisation. Vous pouvez effectuer une analyse classique Bluetooth à l'aide de BluetoothAdapter.getDefaultAdapter().startDiscovery()
et fonctionnant avec les services de localisation désactivés. Cela permettra de découvrir tous les périphériques Bluetooth, BLE et autres. Cependant, les appareils BLE n'auront pas d'enregistrement d'analyse s'ils auraient été vus à la suite de startScan()
.
J'ai résolu ce problème en définissant targetSdkVersion
sur 22 in gradle file . Vous devez déclarer ACCESS_COARSE_LOCATION
dans le manifeste, mais l'analyse BLE fonctionnera même si l'utilisateur refuse cette autorisation de Paramètres d'application.
Ceci est juste un hack pour éviter de demander l'autorisation de localisation. Il est préférable de cibler les dernières versions d'Android.
Ce que j'ai trouvé, c'est qu'après Android 6, vous devez accorder l'autorisation ACCESS_COARSE_LOCATION. Mais sur certains appareils, il est également nécessaire que le service de localisation de votre téléphone (GPS) soit activé afin de pouvoir détecter les périphériques. J'ai trouvé cela en utilisant Nexus 5x, avec Android 7.0.
J'ai aussi essayé ceci sur le manifeste mais je n'ai pas demandé la permission, je ne sais pas pourquoi. Votre application demande-t-elle l'autorisation d'emplacement au démarrage? Si ce n'est pas le cas, nous devons demander l'autorisation au moment de l'exécution .
Vous pouvez également vérifier si votre application fonctionne bien:
Ouvrez Paramètres> Applications> Votre application> Autorisations , Activez Emplacement, puis essayez de rechercher les résultats.
L'emplacement ne sera répertorié ici que si vous avez fourni ACCESS_COARSE_LOCATION sur le manifeste.
Vous pouvez utiliser BluetoothAdapter.startDiscovery()
.
Il recherche les périphériques Bluetooth Smart et Bluetooth classiques, mais il n’est pas nécessaire d’activer les services de localisation.
(Vous avez toujours besoin des autorisations ACCESS_COARSE_LOCATION
sur Android 6.)
Vous pouvez appeler BluetoothDevice.getType
sur les appareils trouvés pour filtrer les appareils Bluetooth Smart/Low Energy.
Eh bien, j’ai examiné mon code écrit dans Eclipse et y ai utilisé la fonction startScan (API 21) sans déclarer de contenu de localisation dans le fichier manifeste. Je reçois toujours le rappel approprié. Avez-vous essayé d’exécuter le code sans la déclaration d’emplacement? En revanche, vous pouvez utiliser l’application obsolète startLeScan (API 18) qui ne nécessite pas ces autorisations. Cependant, à mon avis, la recherche et la lecture des caractéristiques souhaitées dans le service sont plus compliquées avec les méthodes API 18.
D'après ce que j'ai récemment remarqué sur Android 8.0, il n'est pas nécessaire d'allumer votre GPS pour effectuer un balayage BLE, mais vous devez le déclarer dans le manifeste, mais l'utilisateur doit autoriser l'autorisation.
Android demandera à l'utilisateur d'autoriser la localisation lorsque vous essayez d'effectuer une analyse avec la méthode startScan()
. Votre analyse échouera si l’autorisation n’est pas autorisée.