Aby skanować przy niskim zużyciu energii przez Bluetooth w systemie Android 6.0, należy włączyć lokalizację

105

Po uaktualnieniu do systemu Android w wersji 6.0 skanowanie Bluetooth Low Energy (BLE) będzie działać tylko wtedy, gdy usługi lokalizacyjne są włączone na urządzeniu. Zobacz tutaj dla odniesienia: Funkcja startScan Bluetooth Low Energy w systemie Android 6.0 nie znajduje urządzeń

Zasadniczo musisz mieć włączone uprawnienia zarówno dla aplikacji, jak i dla telefonu. Czy to błąd? Czy można skanować bez włączonych usług lokalizacyjnych? Nie chcę mieć lokalizacji dla wszystkich moich aplikacji.

EDYCJA Nie wspomniałem, że używam startScan()metody BluetoothLeScannerpodanej w API 21. Jestem w porządku z kursem i dobrymi uprawnieniami do lokalizacji w manifeście, których ta metoda wymaga. Po prostu nie chcę, aby użytkownicy mojej aplikacji musieli włączać usługi lokalizacyjne na swoim urządzeniu (GPS itp.), Aby korzystać z mojej aplikacji.

Wcześniej startScan()metoda działała i zwracała wyniki z wyłączonymi usługami lokalizacji w telefonie. Jednak na Marshmallow ta sama aplikacja „skanowała”, ale po cichu zawodziła i nie zwracała żadnych wyników, gdy usługi lokalizacyjne nie były włączone na telefonie, a uprawnienia do lokalizacji kursu / dokładnej nadal były w manifeście.

V-PTR
źródło
Z jakich urządzeń korzystasz? Napotkałem ten sam problem z Moto G 2. generacji. Moto G 1.generacji i Nexus 6 działają dobrze z dokładnie tym samym kodem bez jawnego włączania usług lokalizacyjnych.
shadowhorst
Zauważyłem to na każdym urządzeniu z systemem Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Odpowiedzi:

89

Nie, to nie jest błąd.

Ten problem został zgłoszony do Google, gdzie odpowiedzieli, że jest to zamierzone zachowanie i nie naprawią go. Skierowali programistów do tej witryny, gdzie wskazano, że do uzyskania dostępu do identyfikatora sprzętu potrzebne jest teraz pozwolenie na lokalizację. Obecnie obowiązkiem programisty jest uświadomienie użytkownikom tego wymagania.

Jednak w tym wydaniu nie wyjaśniono, dlaczego usługi lokalizacyjne (GPS itp.) Są wymagane i nie wydaje się, aby mieli zamiar powtórzyć ten problem, aby to wyjaśnić, ponieważ został on oznaczony jako zamierzone zachowanie.

Odpowiadając na drugą część pytania: Tak, możliwe jest skanowanie bez włączania usług lokalizacyjnych. Możesz wykonać klasyczne skanowanie Bluetooth za pomocą BluetoothAdapter.getDefaultAdapter().startDiscovery()i będzie działać przy wyłączonych usługach lokalizacyjnych. Spowoduje to wykrycie wszystkich urządzeń Bluetooth, BLE i innych. Jednak urządzenia BLE nie będą miały zapisów skanowania, które miałyby, gdyby były widziane w wyniku startScan().

V-PTR
źródło
12
Google twierdząc, że to nie błąd, pozostawia mnie zimnym. Ich postawa jest po prostu BS.
Marki
21
To nie jest tak naprawdę błąd - jeśli złośliwy programista aplikacji może przeskanować w poszukiwaniu znanych sygnałów nawigacyjnych Bluetooth, może ustalić Twoją lokalizację bez wzbudzania podejrzeń użytkownika, prosząc o pozwolenie na lokalizację. Dlatego prośba o dostęp do BLE musi być niestety traktowana tak samo, jak prośba o przybliżoną lokalizację.
ArtHare
9
Zobaczę, czy mam to prosto. Ogromną zaletą BLE jest bit „LE”, czyli Low Energy, co oznacza mniejsze zużycie baterii. Oczywiście, aby zyskać te oszczędności, muszę włączyć GPS, który jest znanym świrem baterii, negując w ten sposób wszelkie oszczędności energii, które mogłem uzyskać dzięki użyciu BLE. / me kręci głową z niedowierzaniem.
dgnuff
10
To jest niesamowite. Z pewnością, gdyby Google obawiało się wykorzystania skanów BLE do określenia lokalizacji, powinno było dodać do tego oddzielne pozwolenie, zamiast wyrzucać dziecko do kąpieli, zmuszając użytkownika do zezwolenia na dostęp GPS!
Desty
4
@ Pierre-LucPaour Wymuszenie włączenia GPS oznacza, że ​​inne aplikacje, które faktycznie korzystają z usług lokalizacyjnych, mogą z niego korzystać „legalnie” poza sceną. Jednym z powodów, dla których użytkownicy ręcznie wyłączają GPS, jest zapobieganie okresowemu używaniu go przez aplikacje i rozładowywanie baterii, zmuszanie GPS do wyszukiwania Bluetooth jest najbardziej intuicyjnym sposobem poinformowania użytkownika o jego lokalizacji.
Ankit
11

Rozwiązałem to, ustawiając targetSdkVersionna 22 w pliku Gradle. Musisz zadeklarować ACCESS_COARSE_LOCATIONw manifeście, ale skanowanie BLE będzie działać, nawet jeśli użytkownik odmówi tego uprawnienia w ustawieniach aplikacji.

To tylko hack, aby uniknąć prośby o pozwolenie na lokalizację. Lepiej jest kierować reklamy na najnowsze wersje Androida.

Edytować

To rozwiązanie nie powinno już być używane, ponieważ Google Play będzie wymagać, aby nowe aplikacje były przeznaczone co najmniej na Androida 8.0 (poziom API 26). Aplikacje powinny prosić o pozwolenie na lokalizację na potrzeby skanowania BLE.

JiTHiN
źródło
Wielkie dzięki! Czy masz pomysł, co zrobić z bibliotekami, które symulują monitorowanie, na przykład AltBeacon? Nie działają bez lokalizacji na :( i używają w zasadzie tego samego mechanizmu ... A co z minimalną wersją kompilacji? @JiTHiN
Shahar Lahav
Obniżony z 23 do 22 i działa nawet na Androidzie 7.0. Mój początkowy problem polegał na tym, że trzeba było włączyć lokalizację, teraz mogę skanować urządzenia BLE z wyłączoną lokalizacją.
Mariusz Wiazowski
1
To hack, jednak NIE JEST ZALECANY . Zawsze lepiej jest kierować reklamy na najnowsze wersje sdk. Właściwym sposobem na zrobienie tego jest żądanie ACCESS_COARSE_LOCATIONw czasie wykonywania
Aaron
2
To już nie jest rozwiązanie (patrz developer.android.com/distribute/best-practices/develop/) „Google Play będzie wymagać, aby nowe aplikacje były przeznaczone na co najmniej Android 8.0 (poziom API 26) od 1 sierpnia 2018 r. I że aktualizacje aplikacji są przeznaczone na Androida 8.0 od 1 listopada 2018 r. ”)
Étienne
10

Odkryłem, że po Androidzie 6 musisz przyznać uprawnienie ACCESS_COARSE_LOCATION. Jednak w przypadku niektórych urządzeń konieczne jest również włączenie usługi lokalizacji telefonu (GPS), aby można było wykryć urządzenia peryferyjne. Odkryłem, że na Nexusie 5x z Androidem 7.0.

Ivaylo Pankov
źródło
1
To samo dotyczy Nexusa 5x i Androida 6
protectedmember
To samo na Moto G5 plus z Androidem 7.1.1
RootCode
3

Próbowałem też tego w manifeście, ale nie prosiłem o pozwolenie, nie wiem dlaczego. Czy aplikacja wyświetla monit o zezwolenie na lokalizację podczas uruchamiania? Jeśli tak nie jest, musimy poprosić o pozwolenie na działanie .

Możesz również sprawdzić to, aby sprawdzić, czy Twoja aplikacja działa poprawnie:

Otwórz Ustawienia> Aplikacje> Twoja aplikacja> Uprawnienia i włącz opcję Lokalizacja, a następnie spróbuj wyszukać wyniki.

Lokalizacja będzie wymieniona tutaj tylko wtedy, gdy w manifeście podasz ACCESS_COARSE_LOCATION.

Kamal Kishore
źródło
1
Tak, musisz wyraźnie poprosić o pozwolenie w czasie wykonywania, a także włączyć usługi lokalizacyjne dla urządzenia. Ale zastanawiałem się, czy istnieje sposób na wykonanie skanowania BLE bez konieczności włączania usług lokalizacyjnych lub proszenia o pozwolenie na lokalizację kursu w czasie wykonywania.
V-PTR
Żądanie uprawnień nie wystarczy, musisz sprawdzić, czy usługi lokalizacyjne są również włączone.
drindt
3

Możesz użyć BluetoothAdapter.startDiscovery().
Skanuje w poszukiwaniu zarówno urządzeń Bluetooth Smart, jak i klasycznych urządzeń Bluetooth, ale usługi lokalizacyjne nie muszą być włączone.
(Nadal potrzebujesz ACCESS_COARSE_LOCATIONuprawnień w systemie Android 6.)

Możesz zadzwonić BluetoothDevice.getTypena znalezione urządzenia, aby odfiltrować urządzenia Bluetooth Smart / Low Energy.

Noctis
źródło
0

Cóż, spojrzałem na mój kod napisany w Eclipse i używam tam funkcji startScan (API 21) bez deklarowania lokalizacji w pliku manifestu. Nadal otrzymuję prawidłowe oddzwonienie. Czy próbowałeś uruchomić kod bez deklaracji lokalizacji? Z drugiej strony - możesz skorzystać z przestarzałego startLeScan (API 18), który nie wymaga tych uprawnień. Jednak moim zdaniem wyszukiwanie i odczytywanie pożądanych cech w serwisie jest bardziej skomplikowane przy zastosowaniu metod API 18.

Michał Dobi Dobrzański
źródło
Używam startScanfunkcji w BluetoothLeScanner. Celowo używam metod, które nie są przestarzałe. W rzeczywistości sprawdzam urządzenia, które używają interfejsów API w wersji powyżej 21, aby specjalnie używać nowych udostępnionych metod. Próbowałem bez lokalizacji i po prostu cicho zawodzi. Skanowanie przebiega, ale nic nie jest zwracane (przy użyciu metody po API 21)
V-PTR
0

Z tego, co ostatnio zauważyłem na Androidzie 8.0, nie jest wymagane włączanie GPS, aby wykonać skanowanie BLE, ale musisz zadeklarować to w manifeście, ale użytkownik musi zezwolić na zezwolenie.

Android poprosi użytkownika o zezwolenie na lokalizację, gdy spróbujesz wykonać skanowanie startScan()metodą. Skanowanie nie powiedzie się, jeśli zezwolenie nie jest dozwolone.

Lee Boon Kong
źródło