Der Standort muss für das Bluetooth Low Energy Scanning unter Android 6.0 aktiviert sein

94

Nach dem Upgrade auf Android Version 6.0 funktioniert das Bluetooth Low Energy (BLE) -Scannen nur, wenn die Ortungsdienste auf dem Gerät aktiviert sind. Siehe hier als Referenz: Bluetooth Low Energy startScan unter Android 6.0 findet keine Geräte

Grundsätzlich muss die Berechtigung sowohl für die App als auch für das Telefon aktiviert sein. Ist das ein Fehler? Ist es möglich zu scannen, ohne dass die Ortungsdienste tatsächlich aktiviert sind? Ich möchte nicht für alle meine Apps einen Standort haben müssen.

BEARBEITEN Ich habe nicht erwähnt, dass ich die in API 21 bereitgestellte startScan()Methode verwende BluetoothLeScanner. Ich bin mit den für diese Methode erforderlichen Kurs- und Speicherortberechtigungen im Manifest einverstanden. Ich möchte nur nicht, dass die Benutzer meiner App Ortungsdienste auf ihrem Gerät (GPS usw.) aktivieren müssen, um meine App verwenden zu können.

Zuvor wurde die startScan()Methode ausgeführt und gab Ergebnisse zurück , wenn die Ortungsdienste auf dem Telefon deaktiviert waren. Auf Marshmallow "scannte" dieselbe Anwendung jedoch, schlug jedoch stillschweigend fehl und gab keine Ergebnisse zurück, wenn die Ortungsdienste auf dem Telefon nicht aktiviert waren und die Kurs- / Feinstandortberechtigungen noch im Manifest enthalten waren.

V-PTR
quelle
Welche Geräte verwenden Sie? Ich hatte das gleiche Problem mit einem Moto G der 2. Generation. Moto G 1st Generation und Nexus 6 funktionieren einwandfrei mit genau demselben Code, ohne die Ortungsdienste explizit zu aktivieren.
Shadowhorst
Ich habe es auf jedem Gerät bemerkt, auf dem Marshmallow läuft - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Antworten:

81

Nein, das ist kein Fehler.

Dieses Problem wurde bei Google gemeldet, wo sie antworteten, dass dies das beabsichtigte Verhalten sei und sie es nicht beheben würden. Sie haben Entwickler auf diese Site verwiesen, auf der darauf hingewiesen wird, dass für den Zugriff auf die Hardware-ID jetzt eine Standortberechtigung erforderlich ist. Es liegt nun in der Verantwortung des Entwicklers, seine Benutzer auf die Anforderung aufmerksam zu machen.

In dem Problem wird jedoch nicht angesprochen, warum Ortungsdienste (GPS usw.) erforderlich sind, und es scheint nicht, dass sie das Problem erneut aufgreifen werden, um dies zu erklären, da es als beabsichtigtes Verhalten markiert wurde.

So beantworten Sie den zweiten Teil der Frage: Ja, es ist möglich zu scannen, ohne die Ortungsdienste zu aktivieren. Sie können einen klassischen Bluetooth-Scan mit durchführen BluetoothAdapter.getDefaultAdapter().startDiscovery(), der bei ausgeschalteten Standortdiensten funktioniert. Dadurch werden alle Bluetooth-Geräte, BLE und andere erkannt. BLE-Geräte verfügen jedoch nicht über einen Scan-Datensatz, den sie hätten, wenn sie als Ergebnis von gesehen worden wären startScan().

V-PTR
quelle
11
Google behauptet, es sei kein Fehler, lässt mich kalt. Ihre Haltung ist einfach BS.
Marki
21
Es ist nicht wirklich ein Fehler - wenn ein böswilliger App-Entwickler nach bekannten Bluetooth-Beacons suchen kann, kann er Ihren Standort ermitteln, ohne den Verdacht des Benutzers zu erregen, indem er nach Standortberechtigungen fragt. Das Bitten um BLE-Zugang muss daher leider genauso behandelt werden wie das Bitten um Ihren rauen Standort.
ArtHare
3
@orionelenzil "Die andere Berechtigung, die Sie deklarieren müssen, ist entweder ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION. Eine Standortberechtigung ist erforderlich, da Bluetooth-Scans verwendet werden können, um Informationen über den Standort des Benutzers zu sammeln." von developer.android.com/guide/topics/connectivity/bluetooth
ArtHare
7
Lassen Sie mich sehen, ob ich das gerade habe. Der große Vorteil von BLE ist das "LE" -Bit, dh Low Energy, was bedeutet, dass meine Batterie weniger belastet wird. Um diese Einsparungen zu erzielen, muss ich natürlich GPS einschalten, ein bekanntes Batterieproblem, wodurch alle Energieeinsparungen, die ich durch die Verwendung von BLE erzielt habe, zunichte gemacht werden. Ich schüttle ungläubig den Kopf.
Dgnuff
8
Das ist unglaublich. Wenn Google Bedenken hatte, dass BLE-Scans verwendet werden könnten, um auf den Standort zu schließen, hätte Google eine separate Berechtigung hinzufügen müssen, anstatt das Baby mit dem Badewasser herauszuwerfen, indem der Benutzer gezwungen wird, den GPS-Zugriff zuzulassen!
Desty
11

Ich habe dies gelöst, indem ich in der Gradle-Datei targetSdkVersionauf 22 gesetzt habe . Sie müssen ACCESS_COARSE_LOCATIONim Manifest deklarieren, aber das BLE-Scannen funktioniert auch dann, wenn der Benutzer diese Berechtigung in den App-Einstellungen verweigert.

Dies ist nur ein Hack, um zu vermeiden, dass eine Standortberechtigung angefordert wird. Es ist besser, auf die neuesten Android-Versionen abzuzielen.

Bearbeiten

Diese Lösung sollte nicht mehr verwendet werden, da für Google Play neue Apps mindestens Android 8.0 (API-Stufe 26) benötigen. Apps sollten eine Standortgenehmigung für das BLE-Scannen anfordern.

JiTHiN
quelle
Vielen Dank! Haben Sie eine Idee, was Sie mit Bibliotheken tun sollen, die eine Überwachung simulieren, wie beispielsweise AltBeacon? Die funktionieren nicht ohne Ort auf :( und sie verwenden im Grunde den gleichen Mechanismus ... Und was ist mit der Min-Kompilierungsversion? @JiTHiN
Shahar Lahav
Herabgestuft von 23 auf 22 und es funktioniert sogar unter Android 7.0. Mein anfängliches Problem war, dass Sie die Lokalisierung aktivieren mussten. Jetzt kann ich BLE-Geräte mit deaktivierter Lokalisierung scannen.
Mariusz Wiazowski
1
Dies ist ein Hack, dies wird jedoch NICHT EMPFOHLEN. Es ist immer besser, auf die neuesten SDK-Versionen abzuzielen. Der richtige Weg, dies zu tun, ist ACCESS_COARSE_LOCATIONin der Laufzeit anzufordern
Aaron
2
Dies ist keine Lösung mehr (siehe developer.android.com/distribute/best-practices/develop/…). "Google Play erfordert, dass neue Apps ab dem 1. August 2018 auf mindestens Android 8.0 (API-Level 26) abzielen App-Updates zielen auf Android 8.0 vom 1. November 2018 ab. ")
Étienne
10

Ich habe festgestellt, dass Sie nach Android 6 die Berechtigung ACCESS_COARSE_LOCATION erteilen müssen. Bei einigen Geräten muss jedoch auch Ihr Telefonortungsdienst (GPS) eingeschaltet sein, damit Sie Peripheriegeräte erkennen können. Ich fand das mit Nexus 5x, mit Android 7.0.

Ivaylo Pankov
quelle
1
Gleiches gilt für mich mit Nexus 5x und Android 6
protectedmember
Gleiches gilt für Moto G5 plus mit Android 7.1.1
RootCode
2

Ich habe dies auch im Manifest versucht, aber keine Erlaubnis angefordert, nicht sicher warum. Fordert Ihre App beim Start zur Eingabe der Standortberechtigung auf? Ist dies nicht der Fall, müssen wir zur Laufzeit eine Genehmigung anfordern .

Sie können dies auch überprüfen, um zu testen, ob Ihre App einwandfrei funktioniert:

Öffnen Sie Einstellungen> Apps> Ihre Anwendung> Berechtigungen, aktivieren Sie Standort und versuchen Sie dann, nach Ergebnissen zu suchen.

Der Speicherort wird hier nur aufgelistet, wenn Sie ACCESS_COARSE_LOCATION im Manifest angegeben haben.

Kamal Kishore
quelle
1
Ja, Sie müssen die Berechtigung zur Laufzeit explizit anfordern und die Ortungsdienste für das Gerät aktivieren. Ich habe mich jedoch gefragt, ob es eine Möglichkeit gibt, einen BLE-Scan durchzuführen, ohne die Ortungsdienste einschalten oder zur Laufzeit die Erlaubnis zum Kursort anfordern zu müssen.
V-PTR
Das Anfordern von Berechtigungen reicht nicht aus. Sie müssen überprüfen, ob auch Standortdienste aktiviert sind.
Drindt
2

Sie können verwenden BluetoothAdapter.startDiscovery().
Es wird sowohl nach Bluetooth Smart- als auch nach klassischen Bluetooth-Geräten gesucht, aber Ortungsdienste müssen nicht aktiviert werden.
(Sie benötigen noch ACCESS_COARSE_LOCATIONBerechtigungen für Android 6.)

Sie können BluetoothDevice.getTypegefundene Geräte aufrufen , um nach Bluetooth Smart / Low Energy-Geräten zu filtern.

Noctis
quelle
0

Nun, ich habe mir meinen in Eclipse geschriebenen Code angesehen und verwende dort die Funktion startScan (API 21), ohne das Speicherortmaterial in der Manifestdatei zu deklarieren. Ich bekomme immer noch den richtigen Rückruf. Haben Sie versucht, den Code ohne die Standortdeklaration auszuführen? Andererseits können Sie den veralteten startLeScan (API 18) verwenden, für den diese Berechtigungen nicht erforderlich sind. Meiner Meinung nach ist das Suchen und Lesen der gewünschten Merkmale im Dienst mit API 18-Methoden jedoch komplizierter.

Michał Dobi Dobrzański
quelle
Ich benutze die startScanFunktion in BluetoothLeScanner. Ich verwende absichtlich die nicht veralteten Methoden. Tatsächlich suche ich nach Geräten, die APIs größer als 21 verwenden, um die neuen bereitgestellten Methoden speziell zu verwenden. Ich habe es ohne den Ort versucht und es schlägt einfach stillschweigend fehl. Der Scanvorgang wird ausgeführt, es wird jedoch nichts zurückgegeben (mithilfe der Post-API 21-Methode)
V-PTR
0

Nach dem, was ich kürzlich unter Android 8.0 bemerkt habe, ist es nicht erforderlich, Ihr GPS einzuschalten, um einen BLE-Scan durchzuführen. Sie müssen es jedoch im Manifest deklarieren, aber der Benutzer muss die Berechtigung zulassen.

Android fordert den Benutzer auf, die Standortberechtigung zuzulassen, wenn Sie versuchen, einen Scan mit der startScan()Methode durchzuführen . Ihr Scan schlägt fehl, wenn die Berechtigung nicht zulässig ist.

Lee Boon Kong
quelle