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 BluetoothLeScanner
podanej 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.
Odpowiedzi:
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 wynikustartScan()
.źródło
Rozwiązałem to, ustawiając
targetSdkVersion
na 22 w pliku Gradle. Musisz zadeklarowaćACCESS_COARSE_LOCATION
w 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.
źródło
ACCESS_COARSE_LOCATION
w czasie wykonywaniaOdkrył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.
źródło
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.
źródło
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_LOCATION
uprawnień w systemie Android 6.)Możesz zadzwonić
BluetoothDevice.getType
na znalezione urządzenia, aby odfiltrować urządzenia Bluetooth Smart / Low Energy.źródło
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.
źródło
startScan
funkcji wBluetoothLeScanner
. 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)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.źródło
Możesz skanować urządzenia BLE bez dostępu do lokalizacji za pomocą CompanionDeviceManager (API26). https://developer.android.com/reference/android/companion/CompanionDeviceManager .
źródło