it-swarm.com.de

Für Android 6.0 muss der Standort für das Scannen von Bluetooth mit geringem Stromverbrauch aktiviert sein

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

Grundsätzlich müssen Sie die Berechtigung für die App sowie für das Telefon aktiviert haben. Ist das ein Fehler? Ist es möglich, ohne aktivierte Ortungsdienste zu scannen? Ich möchte keinen Ort für all meine Apps haben. 

EDIT Ich habe nicht erwähnt, dass ich die startScan()-Methode in BluetoothLeScanner in API 21 verwende. Ich bin damit einverstanden, dass die Orts- und Kursberechtigungen im Manifest für diese Methode erforderlich sind. Ich möchte nur nicht, dass die Benutzer meiner App Standortdienste auf ihrem Gerät (GPS usw.) aktivieren müssen, um meine App verwenden zu können. 

Bisher wurde die startScan()-Methode ausgeführt und lieferte Ergebnisse, wenn die Ortungsdienste auf dem Telefon deaktiviert waren. Unter Marshmallow würde dieselbe Anwendung jedoch "scannen", aber im Hintergrund fehlgeschlagen und keine Ergebnisse zurückgegeben, wenn Standortdienste nicht auf dem Telefon aktiviert waren und Kurs-/Feinstandortberechtigungen noch im Manifest vorhanden waren.

71
V-PTR

Nein, das ist kein Fehler. 

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

In der Ausgabe wird jedoch nicht darauf eingegangen, warum Ortungsdienste (GPS usw.) erforderlich sind, und es scheint nicht so, als würden sie die Angelegenheit erneut besprechen, um dies zu erklären, da dies als beabsichtigtes Verhalten markiert wurde.

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

54
V-PTR

Ich habe dieses Problem gelöst, indem Sie targetSdkVersion auf 22 in der gradle-Datei festgelegt haben . Sie müssen ACCESS_COARSE_LOCATION im Manifest angeben, aber das BLE-Scannen funktioniert, auch wenn der Benutzer diese Berechtigung in den App-Einstellungen ablehnt.

Dies ist nur ein Hack, um das Anfordern einer Standortgenehmigung zu vermeiden. Es ist besser, die neuesten Android-Versionen als Ziel festzulegen.

10
JiTHiN

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

7
Ivaylo Pankov

Ich habe es auch auf Manifest ausprobiert, aber nicht um Erlaubnis gebeten, nicht sicher warum. Fordert die App beim Start die Standortberechtigung auf? Wenn dies nicht der Fall ist, müssen wir um Erlaubnis zur Laufzeit bitten .

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

Öffnen Sie "Einstellungen"> "Apps"> "Ihre Anwendung"> "Berechtigungen" Aktivieren Sie "Location" und versuchen Sie, nach Ergebnissen zu suchen.

Der Ort wird hier nur aufgeführt, wenn Sie im Manifest ACCESS_COARSE_LOCATION angegeben haben.

2
Kamal Kishore

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

Sie können BluetoothDevice.getType auf gefundenen Geräten anrufen, um nach Bluetooth Smart/Low Energy-Geräten zu filtern.

2
Noctis

Nun, ich habe mir meinen in Eclipse geschriebenen Code angesehen und verwende dort die Funktion startScan (API 21), ohne den Speicherort in der Manifest-Datei anzugeben. 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. Meines Erachtens ist das Suchen und Lesen der gewünschten Merkmale im Betrieb mit API 18-Methoden jedoch komplizierter.

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

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

0
Lee Boon Kong