Місцеположення потрібно ввімкнути для сканування з низьким енергоспоживанням Bluetooth на Android 6.0


99

Після оновлення до версії Android 6.0 сканування Bluetooth із низьким енергоспоживанням (BLE) працюватиме лише в тому випадку, якщо на пристрої ввімкнено служби локації. Див. Тут для довідки: Bluetooth Low Energy startScan на Android 6.0 не знаходить пристроїв

В основному, вам потрібно мати дозвіл на додаток, а також на телефон. Це помилка? Чи можна сканувати без фактично ввімкнених служб визначення місцезнаходження? Я не хочу мати розташування для всіх своїх програм.

РЕДАКТУВАТИ Я не згадував, що я використовую startScan()метод, наведений BluetoothLeScannerв API 21. Я добре з курсом і дозволами на точне розташування в маніфесті, які вимагає цей метод. Я просто не хочу, щоб користувачі мого додатка повинні вмикати служби визначення місцезнаходження на своєму пристрої (GPS тощо) для використання мого додатка.

Раніше startScan()метод запускався і повертав результати з вимкненими службами локації на телефоні. Однак на Зефірі той самий додаток "сканував", але мовчки не працював і не повертав результатів, коли служби локації не були ввімкнені в телефоні, а дозволи на курс / точне розташування все ще були в маніфесті.


Які пристрої ви використовуєте? Я зіткнувся з тією ж проблемою з Moto G 2-го покоління. Moto G 1-го покоління та Nexus 6 працюють нормально з точно однаковим кодом без явного включення служб визначення місцезнаходження.
shadowhorst

Я помітив це на будь-якому пристрої під управлінням Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Відповіді:


85

Ні, це не помилка.

Цю проблему було повідомлено в Google, де вони відповіли, що це передбачувана поведінка, і вони не будуть її виправляти. Вони скерували розробників на цей сайт де він вказує, що для доступу до ідентифікатора апаратного забезпечення зараз потрібен дозвіл на розташування. Зараз розробник несе відповідальність за інформування своїх користувачів про вимогу.

У цьому випуску, однак, не йдеться про те, чому потрібні послуги визначення місцезнаходження (GPS тощо), і, схоже, вони не збираються переглядати цю проблему, щоб пояснити це, оскільки вона була позначена як передбачувана поведінка.

Щоб відповісти на другу частину запитання: Так, можна сканувати, не вмикаючи служби локації. Ви можете виконати класичне сканування Bluetooth за допомогою, BluetoothAdapter.getDefaultAdapter().startDiscovery()і це буде працювати з вимкненими службами локації. Це відкриє всі пристрої Bluetooth, BLE та інші. Однак пристрої BLE не матимуть записів сканування, які вони мали б, якби їх побачили в результаті startScan().


11
Google, стверджуючи, що це не помилка, залишає мене холодним. Їхнє ставлення є простим БС.
Marki

21
Це насправді не помилка - якщо розробник шкідливих програм може сканувати відомі маяки Bluetooth, то вони можуть з’ясувати ваше місцезнаходження, не викликаючи підозр користувача, запитуючи дозволи на розташування. Отже, запит на отримання доступу до BLE, на жаль, повинен розглядатися так само, як запит щодо вашого грубого розташування.
ArtHare

3
@orionelenzil "Іншим дозволом, який ви повинні заявити, є або ACCESS_COARSE_LOCATION, або ACCESS_FINE_LOCATION. Дозвіл на місцезнаходження потрібен, оскільки сканування Bluetooth можна використовувати для збору інформації про місцезнаходження користувача." від developer.android.com/guide/topics/connectivity/bluetooth
ArtHare

7
Дозвольте мені подивитися, чи я маю це прямо. Великою перевагою BLE є біт "LE", тобто низький рівень енергії, що означає зменшений розряд моєї батареї. Звичайно, щоб отримати ці заощадження, я повинен увімкнути GPS, який є відомим свинячим акумулятором, тим самим заперечуючи будь-яку економію енергії, яку я міг отримати від використання BLE. / я недовірливо хитає головою.
dgnuff

8
Це неймовірно. Звичайно, якщо Google був стурбований скануваннями BLE, які використовуються для визначення місця розташування, їм слід було б додати окремий дозвіл на це, а не викидати дитину з водою для ванни, примушуючи користувача дозволити доступ до GPS!
Desty

11

Я вирішив це, встановивши targetSdkVersionна 22 у файлі Gradle. Ви повинні заявитиACCESS_COARSE_LOCATION в маніфесті, але сканування BLE працюватиме, навіть якщо користувач відмовить цьому дозволу в налаштуваннях програми.

Це лише хак, щоб уникнути запиту дозволу на місцезнаходження. Краще орієнтуватися на найновіші версії Android.

Редагувати

Це рішення більше не слід використовувати, оскільки Google Play вимагатиме, щоб нові програми націлювались принаймні на Android 8.0 (рівень API 26). Програми повинні запитувати дозвіл розташування для сканування BLE.


Щиро дякую! У вас є ідея, що робити з бібліотеками, які імітують моніторинг, наприклад AltBeacon? Вони не працюють без розташування на :( і вони використовують в основному один і той же механізм ... А як щодо версії компіляції min? @JiTHiN
Шахар

Понижено з 23 на 22, і він працює навіть на Android 7.0. Моя початкова проблема полягала в тому, що вам довелося ввімкнути локалізацію, тепер я можу сканувати пристрої BLE з вимкненою локалізацією.
Маріуш Вязовський

1
Це хакерство, однак це НЕ РЕКОМЕНДУЄТЬСЯ , завжди краще орієнтуватися на останні версії sdk. Правильний спосіб зробити це - запит ACCESS_COARSE_LOCATIONпід час виконання
Аарон,

2
Це вже не рішення (див. Developer.android.com/distribute/best-practices/develop/... "Google Play вимагатиме, щоб нові додатки націлювались принаймні на Android 8.0 (рівень API 26) з 1 серпня 2018 року, і що оновлення додатків націлено на Android 8.0 з 1 листопада 2018 р. ")
Етьєн,

10

Я виявив, що після Android 6 ви повинні надати дозвіл ACCESS_COARSE_LOCATION. Але на деяких пристроях також потрібно ввімкнути службу визначення місцезнаходження телефону (GPS), щоб ви могли знаходити периферійні пристрої. Я виявив, що використовується Nexus 5x з Android 7.0.


1
Те саме для мене з Nexus 5x та Android 6
захищено

Те саме на Moto G5 plus з Android 7.1.1
RootCode 15.03.18

3

Я також спробував це на маніфесті, але не просив дозволу, не знаю, чому. Ви в додатку запитуєте дозвіл на розташування під час запуску? Якщо це не так, нам потрібно попросити дозволу на час роботи .

Також ви можете перевірити це, щоб перевірити, чи працює ваш додаток нормально:

Відкрийте "Налаштування"> "Додатки"> "Ваш додаток"> "Дозволи" та ввімкніть "Місцезнаходження", а потім спробуйте знайти результати.

Місцезнаходження буде вказано тут, лише якщо ви вказали ACCESS_COARSE_LOCATION у маніфесті.


1
Так, вам потрібно явно запитати дозвіл під час виконання, а також увімкнути служби визначення місцезнаходження для пристрою. Але мені було цікаво, чи є спосіб зробити сканування BLE без необхідності вмикати служби визначення місцезнаходження або вимагати дозволу на розташування курсу під час виконання.
V-PTR

Запиту дозволів недостатньо, вам потрібно перевірити, чи ввімкнені служби визначення місцезнаходження.
drindt

2

Можна використовувати BluetoothAdapter.startDiscovery().
Він буде шукати як Bluetooth Smart, так і класичні пристрої Bluetooth, але служби визначення місцезнаходження не потрібно вмикати.
(Вам все ще потрібні ACCESS_COARSE_LOCATIONдозволи на Android 6.)

Ви можете зателефонувати BluetoothDevice.getTypeна знайдені пристрої, щоб відфільтрувати пристрої Bluetooth Smart / Low Energy.


0

Ну, я переглянув свій код, написаний у Eclipse, і використовую там функцію startScan (API 21), не оголошуючи вміст місця у файлі маніфесту. Я все ще отримую належний зворотний дзвінок. Ви пробували запустити код без оголошення про місцезнаходження? З іншого боку - ви можете використовувати застарілий startLeScan (API 18), який не вимагає цих дозволів. Однак, на мій погляд, пошук і зчитування бажаних характеристик в сервісі складніші за допомогою методів API 18.


Я використовую startScanфункцію в BluetoothLeScanner. Я цілеспрямовано використовую застарілі методи. Насправді я перевіряю, чи пристрої, які використовують API більше 21, спеціально використовують нові надані методи. Я намагався без розташування, і це просто мовчки не вдається. Сканування виконується, але нічого не повертається (за допомогою методу post-API 21)
V-PTR

0

З того, що я нещодавно помітив на android 8.0, не потрібно вмикати ваш GPS, щоб зробити сканування BLE, але ви повинні заявити про це в маніфесті, але користувач повинен дозволити дозвіл.

Android запропонує користувачеві дозволити доступ до місцезнаходження під час спроби виконати сканування startScan()методом. Сканування не вдасться, якщо дозвіл заборонено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.