Местоположение должно быть включено для сканирования низкой энергии Bluetooth на Android 6.0

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

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

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

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

6 ответов


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

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

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

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


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


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


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

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

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

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


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

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


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