48

Nach dem Upgrade auf Android Version 6.0 funktioniert der Bluetooth Low Energy (BLE) -Scan nur, wenn die Standortdienste auf dem Gerät aktiviert sind. Siehe hier als Referenz: Bluetooth Low Energy startScan on Android 6.0 does not find devicesDer Standort muss für Bluetooth Low Energy Scanning unter Android 6.0 aktiviert sein.

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 Standortdienste zu scannen? Ich möchte keinen Standort für alle meine Apps haben müssen. Ich bin in Ordnung mit der Grob- und Fein Lage Berechtigungen im Manifest

EDIT ich nicht zu erwähnen, dass ich die startScan() Methode in BluetoothLeScanner in API 21 vorgesehen bin mit, dass diese Methode erforderlich. Ich möchte nur nicht, dass die Nutzer meiner App die Standortdienste auf ihrem Gerät (GPS usw.) aktivieren müssen, um meine App zu verwenden.

Zuvor wurde die Methode startScan() ausgeführt und Ergebnisse mit den auf dem Telefon deaktivierten Standortdiensten zurückgegeben. Auf Marshmallow wurde dieselbe Anwendung jedoch "gescannt", aber im Hintergrund fehlgeschlagen, und es wurden keine Ergebnisse zurückgegeben, wenn die Standortdienste auf dem Telefon nicht aktiviert waren und sich Kurs-/Feinstandortberechtigungen noch im Manifest befanden.

+0

Welche Geräte verwenden Sie? Ich hatte das gleiche Problem mit einer Moto G 2nd Generation. Moto G 1. Generation und Nexus 6 laufen einwandfrei mit genau dem gleichen Code, ohne die Ortungsdienste explizit zu aktivieren. – shadowhorst

+0

Ich habe es auf jedem Gerät mit Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4 –

Antwort

22

Nein, das ist kein Fehler.

Diese issue wurde an Google weitergeleitet, wo sie antworteten, dass dies das beabsichtigte Verhalten sei und sie es nicht beheben würden. Sie verwiesen die Entwickler auf this site, wo es darauf hinweist, dass die Standortberechtigung jetzt für den Zugriff auf die Hardware-ID benötigt wird. Es liegt nun in der Verantwortung des Entwicklers, seine Benutzer auf die Anforderung aufmerksam zu machen.

In der Ausgabe wird jedoch nicht erläutert, warum Standortdienste (GPS usw.) erforderlich sind, und es scheint nicht so, als würden sie das Problem erneut untersuchen, um es zu erklären, da es als beabsichtigtes Verhalten.

Um den zweiten Teil der Frage zu beantworten: Ja, es ist möglich zu scannen, ohne Standortdienste zu aktivieren. Sie können einen klassischen Bluetooth-Scan mit BluetoothAdapter.getDefaultAdapter().startDiscovery() durchführen, der mit den Standortdiensten funktioniert. Dies wird alle Bluetooth-Geräte, BLE und andere entdecken. BLE-Geräte verfügen jedoch nicht über einen Scan-Datensatz, den sie erhalten hätten, wenn sie als Ergebnis von startScan() erkannt wurden.

+1

Das ist die richtige Antwort – KRUKUSA

+0

Also welche ist der richtige Weg? – Mikhail

0

Nun, ich habe mir meinen in Eclipse geschriebenen Code angeschaut und benutze dort die startScan (API 21) -Funktion ohne Deklaration von location stuff in der Manifest-Datei. Ich bekomme immer noch den richtigen Rückruf. Haben Sie versucht, den Code ohne die Standortdeklaration auszuführen? Auf der anderen Seite können Sie den veralteten startLeScan (API 18) verwenden, der diese Berechtigungen nicht benötigt. Meiner Meinung nach ist das Suchen und Lesen der gewünschten Eigenschaft im Service jedoch mit API 18-Methoden komplizierter.

+0

Ich habe die 'startScan' -Funktion 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 scheitert einfach still. Der Scanvorgang läuft, aber es wird nichts zurückgegeben (mit der Methode post-API 21). –

0

Ich versuchte dies auch auf manifest, aber nicht um Erlaubnis, nicht sicher, warum. Fragen Sie beim Start nach einer App für die Standortberechtigung? Wenn nicht, müssen wir .

Auch können Sie dies überprüfen, um zu testen, ob die App funktioniert prima:

Öffnen Sie Einstellungen> Apps> YourApplication> Berechtigungen und ermöglichen Ort und dann versuchen, für Ergebnisse zu scannen.

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

+1

Ja, Sie müssen die Berechtigung zur Laufzeit explizit anfordern und Standortdienste für das Gerät aktivieren. Aber ich habe mich gefragt, ob es eine Möglichkeit gibt, einen BLE-Scan durchzuführen, ohne die Standortdienste aktivieren zu müssen oder die Berechtigung zum Kursstandort zur Laufzeit anzufordern. –

1

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

EDIT:
Sie BluetoothDevice.getType auf gefundenen Geräte für Bluetooth Smart/Low Energy Geräte filtern aufrufen können.

3

Was ich gefunden habe, ist, dass Sie nach Android 6 ACCESS_COARSE_LOCATION Erlaubnis gewähren müssen. Aber auf einigen Geräten muss auch Ihr Telefon-Ortungsdienst (GPS) eingeschaltet sein, damit Sie Peripheriegeräte entdecken können. Ich habe festgestellt, dass mit Nexus 5x, mit Android 7.0.

+0

Das gleiche für mich mit Nexus 5x und Android 6 – protectedmember

8

Ich löste dies durch Einstellung targetSdkVersion zu in Gradle-Datei. Sie müssen im Manifest ACCESS_COARSE_LOCATION deklarieren, aber das BLE-Scannen funktioniert auch dann, wenn der Benutzer diese Berechtigung aus den App-Einstellungen ablehnt.

+0

Unglaublich, aber dieser hat den Trick gemacht. Danke @JiTHiN !!! – Billyjoker

+0

Großartig, danke! Haben Sie eine Idee, was Sie mit Bibliotheken tun sollten, die zum Beispiel AltBeacon simulieren? Die funktionieren nicht ohne Ort auf :(und sie verwenden im Grunde den gleichen Mechanismus ... Und was ist mit der min kompilieren Version? @JiTHiN –

+0

Downgraded von 23 bis 22 und es funktioniert auch auf Android 7.0. Mein erstes Problem war das du musst die Lokalisierung aktivieren, jetzt kann ich BLE-Geräte mit deaktivierter Lokalisierung scannen –