После обновления до версии Android 6.0 сканирование Bluetooth с низким энергопотреблением (BLE) будет работать, только если на устройстве включены службы определения местоположения. См. Здесь для справки: Bluetooth Low Energy startScan на Android 6.0 не находит устройства
По сути, вам нужно, чтобы разрешение было включено как для приложения, так и для телефона. Это ошибка? Возможно ли сканирование без включения служб определения местоположения? Я не хочу, чтобы у всех моих приложений было местоположение.
ИЗМЕНИТЬ
Я не упомянул, что использую startScan()
метод, BluetoothLeScanner
указанный в API 21. Я согласен с курсом и разрешениями на точное местоположение в манифесте, которые требуются для этого метода. Я просто не хочу, чтобы пользователям моего приложения приходилось включать службы определения местоположения на своих устройствах (GPS и т. Д.), Чтобы использовать мое приложение.
Раньше startScan()
метод запускался и возвращал результаты с отключенными на телефоне службами определения местоположения. Однако на Marshmallow то же приложение «сканировало», но молча терпело неудачу и не возвращало никаких результатов, если службы определения местоположения не были включены на телефоне, а разрешения на определение местоположения / определения местоположения все еще были в манифесте.
Ответы:
Нет, это не ошибка.
Эта проблема была передана в Google, где они ответили, что это предполагаемое поведение и они не будут его исправлять. Они направили разработчиков на этот сайт, где указано, что для доступа к идентификатору оборудования теперь требуется разрешение на местоположение. Теперь ответственность за информирование пользователей о требовании лежит на разработчике.
Однако в проблеме не говорится о том, почему требуются службы определения местоположения (GPS и т. Д.), И не похоже, что они собираются возвращаться к проблеме, чтобы объяснить это, поскольку это было помечено как предполагаемое поведение.
Чтобы ответить на вторую часть вопроса: Да, можно сканировать без включения службы определения местоположения. Вы можете выполнить классическое сканирование Bluetooth с помощью,
BluetoothAdapter.getDefaultAdapter().startDiscovery()
и оно будет работать с отключенными службами определения местоположения. Это обнаружит все устройства Bluetooth, BLE и другие. Однако устройства BLE не будут иметь записи сканирования, которая у них была бы, если бы они были замечены в результатеstartScan()
.источник
Я решил это, установив
targetSdkVersion
значение 22 в файле Gradle. Вы должны указать этоACCESS_COARSE_LOCATION
в манифесте, но сканирование BLE будет работать, даже если пользователь откажется от этого разрешения в настройках приложения.Это просто уловка, чтобы не запрашивать разрешение на местоположение. Лучше ориентироваться на последние версии Android.
редактировать
Это решение больше не следует использовать, поскольку для Google Play требуется, чтобы новые приложения были ориентированы как минимум на Android 8.0 (уровень API 26). Приложения должны запрашивать разрешение на местоположение для сканирования BLE.
источник
ACCESS_COARSE_LOCATION
во время выполненияЯ обнаружил, что после Android 6 вы должны предоставить разрешение ACCESS_COARSE_LOCATION. Но на некоторых устройствах также необходимо включить службу определения местоположения телефона (GPS), чтобы вы могли обнаруживать периферийные устройства. Я обнаружил, что при использовании Nexus 5x с Android 7.0.
источник
Я также пробовал это в манифесте, но не запрашивал разрешения, не знаю почему. Приложение запрашивает разрешение на определение местоположения при запуске? Если это не так, нам нужно запросить разрешение во время выполнения .
Также вы можете проверить это, чтобы проверить, нормально ли работает ваше приложение:
Откройте «Настройки»> «Приложения»> «Ваше приложение»> «Разрешения» и включите «Местоположение», а затем попробуйте поискать результаты.
Местоположение будет указано здесь, только если вы указали ACCESS_COARSE_LOCATION в манифесте.
источник
Вы можете использовать
BluetoothAdapter.startDiscovery()
.Он будет сканировать как Bluetooth Smart, так и классические устройства Bluetooth, но службы определения местоположения не должны быть включены.
(Вам все еще нужны
ACCESS_COARSE_LOCATION
разрешения на Android 6.)Вы можете вызвать
BluetoothDevice.getType
найденные устройства для фильтрации устройств Bluetooth Smart / Low Energy.источник
Что ж, я просмотрел свой код, написанный в Eclipse, и использую там функцию startScan (API 21) без объявления местоположения в файле манифеста. Я все еще получаю правильный обратный звонок. Вы пробовали запустить код без объявления местоположения? С другой стороны, вы можете использовать устаревший startLeScan (API 18), который не требует этих разрешений. Однако, на мой взгляд, поиск и чтение желаемой характеристики в сервисе сложнее с методами API 18.
источник
startScan
функцию вBluetoothLeScanner
. Я целенаправленно использую нерекомендуемые методы. Фактически, я проверяю устройства, которые используют API больше 21, чтобы специально использовать новые предоставленные методы. Я попробовал без определения местоположения, но ничего не вышло. Сканирование выполняется, но ничего не возвращается (с использованием метода post-API 21)Из того, что я недавно заметил на android 8.0, не требуется включать GPS, чтобы выполнить сканирование BLE, но вы должны объявить это в манифесте, но пользователь должен разрешить разрешение.
Android предложит пользователю разрешить определение местоположения, когда вы попытаетесь выполнить сканирование с помощью
startScan()
метода. Ваше сканирование не удастся, если разрешение не разрешено.источник
Вы можете сканировать устройства BLE без доступа к местоположению с помощью CompanionDeviceManager (API26). https://developer.android.com/reference/android/companion/CompanionDeviceManager .
источник