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

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

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

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

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

Solutions Collecting From Web of "Для включения Bluetooth Low Energy Scanning на Android 6.0 необходимо включить местоположение"

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

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

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

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

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

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

РЕДАКТИРОВАТЬ:
Вы можете вызывать BluetoothDevice.getType на найденных устройствах для фильтрации устройств Bluetooth Smart / Low Energy.

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

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

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

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

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

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