Необходимо включить определение местоположения для сканирования Bluetooth с низким энергопотреблением на Android 6.0.

105

После обновления до версии Android 6.0 сканирование Bluetooth с низким энергопотреблением (BLE) будет работать, только если на устройстве включены службы определения местоположения. См. Здесь для справки: Bluetooth Low Energy startScan на Android 6.0 не находит устройства

По сути, вам нужно, чтобы разрешение было включено как для приложения, так и для телефона. Это ошибка? Возможно ли сканирование без включения служб определения местоположения? Я не хочу, чтобы у всех моих приложений было местоположение.

ИЗМЕНИТЬ Я не упомянул, что использую startScan()метод, BluetoothLeScannerуказанный в API 21. Я согласен с курсом и разрешениями на точное местоположение в манифесте, которые требуются для этого метода. Я просто не хочу, чтобы пользователям моего приложения приходилось включать службы определения местоположения на своих устройствах (GPS и т. Д.), Чтобы использовать мое приложение.

Раньше startScan()метод запускался и возвращал результаты с отключенными на телефоне службами определения местоположения. Однако на Marshmallow то же приложение «сканировало», но молча терпело неудачу и не возвращало никаких результатов, если службы определения местоположения не были включены на телефоне, а разрешения на определение местоположения / определения местоположения все еще были в манифесте.

V-PTR
источник
Какие устройства вы используете? Я столкнулся с той же проблемой с Moto G 2-го поколения. Moto G 1-го поколения и Nexus 6 отлично работают с одним и тем же кодом без явного включения служб определения местоположения.
shadowhorst
Я заметил это на любом устройстве под управлением Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Ответы:

89

Нет, это не ошибка.

Эта проблема была передана в Google, где они ответили, что это предполагаемое поведение и они не будут его исправлять. Они направили разработчиков на этот сайт, где указано, что для доступа к идентификатору оборудования теперь требуется разрешение на местоположение. Теперь ответственность за информирование пользователей о требовании лежит на разработчике.

Однако в проблеме не говорится о том, почему требуются службы определения местоположения (GPS и т. Д.), И не похоже, что они собираются возвращаться к проблеме, чтобы объяснить это, поскольку это было помечено как предполагаемое поведение.

Чтобы ответить на вторую часть вопроса: Да, можно сканировать без включения службы определения местоположения. Вы можете выполнить классическое сканирование Bluetooth с помощью, BluetoothAdapter.getDefaultAdapter().startDiscovery()и оно будет работать с отключенными службами определения местоположения. Это обнаружит все устройства Bluetooth, BLE и другие. Однако устройства BLE не будут иметь записи сканирования, которая у них была бы, если бы они были замечены в результате startScan().

V-PTR
источник
12
Гугл, утверждающий, что это не ошибка, меня не устраивает. Их отношение просто чушь.
Marki
21
На самом деле это не ошибка - если разработчик вредоносного приложения может сканировать известные маяки Bluetooth, он может определить ваше местоположение, не вызывая подозрений у пользователя, запрашивая разрешения на определение местоположения. Таким образом, запрос на доступ к BLE, к сожалению, должен рассматриваться так же, как запрос вашего приблизительного местонахождения.
ArtHare 01
9
Дай мне посмотреть, правильно ли я понял. Большим преимуществом BLE является бит «LE», то есть Low Energy, что означает уменьшение расхода заряда моей батареи. Конечно, чтобы получить эту экономию, мне нужно включить GPS, который, как известно, расходует заряд батареи, что сводит на нет любую экономию энергии, которую я мог бы получить от использования BLE. / я недоверчиво качает головой.
dgnuff
10
Это невероятно. Конечно, если бы Google был обеспокоен тем, что сканирование BLE используется для определения местоположения, им следовало бы добавить для этого отдельное разрешение, а не выбрасывать ребенка с водой в ванну, заставляя пользователя разрешить доступ к GPS!
Дести
4
@ Pierre-LucPaour Принудительное включение GPS означает, что другие приложения, которые фактически используют службы определения местоположения, могут использовать его «легально» за кулисами. Одна из причин, по которой пользователи вручную отключают GPS, заключается в том, чтобы предотвратить его периодическое использование приложениями и разряжать батарею, принуждение GPS к поиску Bluetooth - самый интуитивно противоречивый способ сообщить пользователю, что его местоположение может быть использовано.
Ankit
11

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

Это просто уловка, чтобы не запрашивать разрешение на местоположение. Лучше ориентироваться на последние версии Android.

редактировать

Это решение больше не следует использовать, поскольку для Google Play требуется, чтобы новые приложения были ориентированы как минимум на Android 8.0 (уровень API 26). Приложения должны запрашивать разрешение на местоположение для сканирования BLE.

JiTHiN
источник
Большое спасибо! У вас есть идеи, что делать с библиотеками, имитирующими мониторинг, например, с AltBeacon? Они не работают без местоположения на :( и они используют в основном тот же механизм ... А как насчет минимальной версии компиляции? @JiTHiN
Шахар Лахав
Понижен с 23 до 22 и работает даже на Android 7.0. Моя первоначальная проблема заключалась в том, что вам нужно было включить локализацию, теперь я могу сканировать устройства BLE с отключенной локализацией.
Mariusz Wiazowski
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
protectedmember
То же самое с Moto G5 plus с Android 7.1.1
RootCode
3

Я также пробовал это в манифесте, но не запрашивал разрешения, не знаю почему. Приложение запрашивает разрешение на определение местоположения при запуске? Если это не так, нам нужно запросить разрешение во время выполнения .

Также вы можете проверить это, чтобы проверить, нормально ли работает ваше приложение:

Откройте «Настройки»> «Приложения»> «Ваше приложение»> «Разрешения» и включите «Местоположение», а затем попробуйте поискать результаты.

Местоположение будет указано здесь, только если вы указали ACCESS_COARSE_LOCATION в манифесте.

Камаль Кишор
источник
1
Да, вы должны явно запросить разрешение во время выполнения, а также включить службы определения местоположения для устройства. Но мне было интересно, есть ли способ выполнить сканирование BLE без необходимости включать службы определения местоположения или запрашивать разрешение на местоположение курса во время выполнения.
V-PTR
Запроса разрешений недостаточно, вам нужно проверить, включены ли службы определения местоположения.
drindt
3

Вы можете использовать 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()метода. Ваше сканирование не удастся, если разрешение не разрешено.

Ли Бун Конг
источник