it-roy-ru.com

Местоположение должно быть включено для Bluetooth Low Energy Scanning на Android 6.0

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

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

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

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

71
V-PTR

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

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

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

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

54
V-PTR

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

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

10
JiTHiN

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

7
Ivaylo Pankov

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

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

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

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

2
Kamal Kishore

Вы можете использовать BluetoothAdapter.startDiscovery().
Он будет сканировать как Bluetooth Smart, так и классические устройства Bluetooth, но услуги определения местоположения не должны быть включены.
(Вам все еще нужны разрешения ACCESS_COARSE_LOCATION на Android 6.)

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

2
Noctis

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

0
Michał Dobi Dobrzański

Из того, что я недавно заметил на Android 8.0, не требуется включать GPS для сканирования BLE, но вы должны объявить его в манифесте, но пользователь должен разрешить разрешение.

Android предложит пользователю разрешить определение местоположения при попытке сканирования методом startScan(). Ваше сканирование не удастся, если разрешение не разрешено.

0
Lee Boon Kong