Расположение должно быть включено для сканирования Bluetooth с низким энергопотреблением на Android 6.0
после обновления до Android версии 6.0 Bluetooth Low Energy (BLE) сканирование будет работать только в том случае, если на устройстве включены службы определения местоположения. Смотрите здесь для справки:Bluetooth Low Energy startScan на Android 6.0 не находит устройств
в принципе, вы должны иметь разрешение для приложения, а также по телефону. Это ошибка? Можно ли сканировать без включения служб определения местоположения? Я не хочу, чтобы у меня было место для всех моих приложения.
EDIT
Я не упомянул, что я использую 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 > Разрешения и включите расположение, а затем попробуйте проверить результаты.
расположение будет указано здесь, только если вы предоставили 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.