Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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