Après la mise à niveau vers la version Android 6.0, l'analyse Bluetooth Low Energy (BLE) ne fonctionnera que si les services de localisation sont activés sur l'appareil. Voir ici pour référence: Bluetooth Low Energy startScan sur Android 6.0 ne trouve pas les appareils
Fondamentalement, vous devez activer l'autorisation pour l'application ainsi que pour le téléphone. Est-ce un bug? Est-il possible de scanner sans que les services de localisation soient réellement activés? Je ne veux pas avoir de localisation pour toutes mes applications.
EDIT
J'ai omis de mentionner que j'utilise la startScan()
méthode BluetoothLeScanner
fournie dans l'API 21. Je suis d'accord avec le cours et les autorisations de localisation fines dans le manifeste que cette méthode nécessite. Je ne veux tout simplement pas que les utilisateurs de mon application doivent activer les services de localisation sur leur appareil (GPS, etc.) pour utiliser mon application.
Auparavant, la startScan()
méthode s'exécutait et renvoyait des résultats avec les services de localisation désactivés sur le téléphone. Sur Marshmallow, cependant, la même application «analysait» mais échouait silencieusement 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 cours / emplacement précis étaient toujours dans le manifeste.
Réponses:
Non, ce n'est pas un bug.
Ce problème a été signalé à Google, où ils ont répondu en disant que c'était le comportement prévu et qu'ils ne le résoudraient pas. Ils ont dirigé les développeurs vers ce site où il indique que l'autorisation de localisation est désormais nécessaire pour l'accès à l'identifiant matériel. Il est désormais de la responsabilité du développeur de sensibiliser ses utilisateurs à l'exigence.
Dans le problème, cependant, il ne traite pas de la raison pour laquelle les services de localisation (GPS, etc.) sont nécessaires et il ne semble pas qu'ils vont revoir le problème pour l'expliquer car il a été marqué comme le comportement prévu.
Pour répondre à la deuxième partie de la question: Oui, il est possible de scanner sans activer les services de localisation. Vous pouvez effectuer une analyse Bluetooth classique en utilisant
BluetoothAdapter.getDefaultAdapter().startDiscovery()
et qui fonctionnera avec les services de localisation désactivés. Cela permettra de découvrir tous les appareils Bluetooth, BLE et autres. Cependant, les appareils BLE n'auront pas d'enregistrement de scan qu'ils auraient eu s'ils avaient été vus à la suite destartScan()
.la source
J'ai résolu ce problème en définissant
targetSdkVersion
sur 22 dans le fichier Gradle. Vous devez déclarerACCESS_COARSE_LOCATION
dans le manifeste, mais l'analyse BLE fonctionnera même si l'utilisateur refuse cette autorisation dans les paramètres de l'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.
Éditer
Cette solution ne devrait plus être utilisée car Google Play exigera que les nouvelles applications ciblent au moins Android 8.0 (niveau d'API 26). Les applications doivent demander une autorisation de localisation pour l'analyse BLE.
la source
ACCESS_COARSE_LOCATION
à l'exécutionCe 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 votre service de localisation de téléphone (GPS) soit activé, afin que vous puissiez découvrir les périphériques. J'ai trouvé cela en utilisant Nexus 5x, avec Android 7.0.
la source
J'ai également essayé cela sur le manifeste mais je n'ai pas demandé la permission, je ne sais pas pourquoi. Votre application demande-t-elle l'autorisation de localisation au démarrage? Si ce n'est pas le cas, nous devons demander une autorisation lors de l'exécution .
Vous pouvez également vérifier ceci pour tester si votre application fonctionne correctement:
Ouvrez Paramètres> Applications> Votre application> Autorisations et activez la localisation, puis essayez de rechercher les résultats.
L'emplacement sera répertorié ici uniquement si vous avez indiqué ACCESS_COARSE_LOCATION sur le manifeste.
la source
Vous pouvez utiliser
BluetoothAdapter.startDiscovery()
.Il recherchera à la fois les appareils Bluetooth Smart et Bluetooth classiques, mais les services de localisation n'ont pas besoin d'être activés.
(Vous avez toujours besoin d'
ACCESS_COARSE_LOCATION
autorisations sur Android 6.)Vous pouvez appeler
BluetoothDevice.getType
les appareils trouvés pour filtrer les appareils Bluetooth Smart / Low Energy.la source
Eh bien, j'ai regardé mon code écrit dans Eclipse et j'utilise là la fonction startScan (API 21) sans déclarer les éléments d'emplacement 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? D'autre part, vous pouvez utiliser le startLeScan (API 18) obsolète qui ne nécessite pas ces autorisations. Cependant, à mon avis, la recherche et la lecture des caractéristiques souhaitées en service sont plus compliquées avec les méthodes API 18.
la source
startScan
fonction dansBluetoothLeScanner
. J'utilise délibérément les méthodes non obsolètes. En fait, je recherche les appareils qui utilisent des API supérieures à 21 pour utiliser spécifiquement les nouvelles méthodes fournies. J'ai essayé sans l'emplacement et cela échoue silencieusement. L'analyse s'exécute mais rien n'est retourné (en utilisant la méthode post-API 21)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 une analyse BLE, mais vous devez le déclarer dans le manifeste, mais l'utilisateur doit autoriser l'autorisation.
Android invitera l'utilisateur à autoriser l'autorisation de localisation lorsque vous tentez d'effectuer une analyse avec
startScan()
méthode. Votre analyse échouera si l'autorisation n'est pas autorisée.la source