La localisation doit être activée pour la numérisation Bluetooth Low Energy sur Android 6.0

98

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 BluetoothLeScannerfournie 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.

V-PTR
la source
Quels appareils utilisez-vous? J'ai rencontré le même problème avec un Moto G 2e génération. Moto G 1ère génération et Nexus 6 fonctionnent correctement avec exactement le même code sans activer explicitement les services de localisation.
shadowhorst
Je l'ai remarqué sur n'importe quel appareil exécutant Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Réponses:

85

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 de startScan().

V-PTR
la source
11
Google prétendant que ce n'est pas un bug me laisse froid. Leur attitude est simple BS.
Marki
21
Ce n'est pas vraiment un bogue - si un développeur d'applications malveillantes peut rechercher des balises Bluetooth connues, il peut déterminer votre emplacement sans éveiller les soupçons de l'utilisateur en demandant des autorisations de localisation. Donc, demander un accès BLE doit malheureusement être traité de la même manière que demander votre emplacement approximatif.
ArtHare
3
@orionelenzil "L'autre autorisation que vous devez déclarer est ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION. Une autorisation de localisation est requise car les analyses Bluetooth peuvent être utilisées pour collecter des informations sur la localisation de l'utilisateur." de developer.android.com/guide/topics/connectivity/bluetooth
ArtHare
7
Laissez-moi voir si j'ai ce droit. Le grand avantage de BLE est le bit "LE", c'est-à-dire Low Energy, ce qui signifie une consommation réduite de ma batterie. Bien sûr, pour réaliser ces économies, je dois activer le GPS, qui est une batterie connue, annulant ainsi les économies d'énergie que j'aurais pu obtenir grâce à l'utilisation de BLE. / moi secoue la tête avec incrédulité.
dgnuff
8
C'est incroyable. Si Google craignait sûrement que les scans BLE soient utilisés pour déduire l'emplacement, ils auraient dû ajouter une autorisation distincte pour cela, plutôt que de jeter le bébé avec l'eau du bain en forçant l'utilisateur à autoriser l'accès au GPS!
Desty
11

J'ai résolu ce problème en définissant targetSdkVersionsur 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.

JiTHiN
la source
Grand merci! Avez-vous une idée de ce qu'il faut faire avec les bibliothèques qui simulent la surveillance comme AltBeacon par exemple? Le ne fonctionne pas sans emplacement sur: (et ils utilisent essentiellement le même mécanisme ... Et qu'en est-il de la version de compilation minimale? @JiTHiN
Shahar Lahav
Rétrogradé de 23 à 22 et fonctionne même sur Android 7.0. Mon problème initial était que vous deviez activer la localisation, maintenant je peux analyser les périphériques BLE avec la localisation désactivée.
Mariusz Wiazowski
1
Ceci est un hack, mais ce n'est PAS RECOMMANDÉ, il est toujours préférable de cibler les dernières versions de sdk. La bonne façon de faire est de demander ACCESS_COARSE_LOCATIONà l'exécution
Aaron
2
Ce n'est plus une solution (voir developer.android.com/distribute/best-practices/develop/… "Google Play exigera que les nouvelles applications ciblent au moins Android 8.0 (niveau d'API 26) à partir du 1er août 2018, et que les mises à jour de l'application ciblent Android 8.0 à partir du 1er novembre 2018. ")
Étienne
10

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 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.

Ivaylo Pankov
la source
1
Pareil pour moi avec Nexus 5x et Android 6
protégé
Idem sur Moto G5 plus avec Android 7.1.1
RootCode
2

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.

Kamal Kishore
la source
1
Oui, vous devez demander explicitement l'autorisation au moment de l'exécution et activer les services de localisation pour l'appareil. Mais je me demandais s'il y avait un moyen de faire une analyse BLE sans avoir à activer les services de localisation ou à demander l'autorisation de localisation du cours au moment de l'exécution.
V-PTR
Demander des autorisations ne suffit pas, vous devez vérifier si les services de localisation sont également activés.
drindt
2

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_LOCATIONautorisations sur Android 6.)

Vous pouvez appeler BluetoothDevice.getTypeles appareils trouvés pour filtrer les appareils Bluetooth Smart / Low Energy.

Noctis
la source
0

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.

Michał Dobi Dobrzański
la source
J'utilise la startScanfonction dans BluetoothLeScanner. 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)
V-PTR
0

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.

Lee Boon Kong
la source