Как стать автором
Обновить

Комментарии 17

Меня удивляет в последних Android необходимость ACCESS_FINE_LOCATION для работы с BLE. Я предпочитаю держать на телефоне локацию отключенной (чтобы был отключен GPS), но это приводит к тому, что BLE устройства отваливаются.
Особенно это отпугивает потенциальных пользователей: делаешь приложение для работы с BLE девайсом, а оно просит доступ к локации. У пользователя сразу паранойя включается (что совершенно разумно).

Там логика чуть «обратная»: приложение, имеющее доступ к Bluetooth (и только к нему), потенциально уже может отслеживать положение (относительно других устройств, среди которых бывают и специально маячки), о чём и ставят в известность пользователя.

Справедливости ради, ACCESS_FINE_LOCATION требуется только для первоначального сканирования, для фазы подключения/обмена этот permission не требуется.
Официальная документация говорит Required only if your app isn't using the Device Companion Manager.
Обычно, перед сканированием, у пользователя показывается UI попап с объяснением почему нужен доступ к геолокации.

При использовании Companion Device Api пермишен на локацию ни на одном этапе не нужен, включая сканирование

Да это шаг вперед, согласен, но я не нашел способа добавить больше чем 1 устройство за раз. Что интересно, я могу показать все нужные устройства, но вот добавлять системный UI дает только по одному.

но я не нашел способа добавить больше чем 1 устройство за раз

Это как? В bounded? Я сейчас делаю open-source приложение как раз с использованием Companion API, выглядит это так:


Есть ещё забавное поведение, которое нигде не документируется - для работы этого API необходимо чтобы на девайсе была включена локация. Сам API не обрабатывает кейс когда локация выключена. Поэтому все равно придется просить пользователя включить местоположение ручками

Ну вот я про этот системный диалог говорю, как в нем выбрать сразу 2 девайса? Там singleSelect и повлиять я не смог на это.

Никак, надо запускать этот диалог заново

А зачем вам нужно два устройства сразу?

Ну вообще их 4 может быть, это терапевтические медицинские устройства. Добавлять по-одному довольно муторно выходит для пользователей.

Согласен, я бы не заморачивался

Да локация нужна как системный сервис, CompanionApi вроде как доверенное и ему пермишен локации не нужен, но сервис таки требуется.

Да, но по хорошему если он видит что локация выключена - пусть попросит включить, а так приложение должно это закодить и от своего имени просить включить локацию.

Если посмотреть в спецификацию BLE, то можно найти следующую информацию. Устройство рассылающее Advertisement data делает это не целиком. Оно посылает пакет с 32 байтами из этих Advertisement data. При пассивном сканировании это вся информация, которую получает сканирующее устройство. Если же сканирование активное, то сканирующее устройство делает запрос на следующую порцию данных и получает оставшиеся 32 байта. Этот запрос содержит настоящий или случайный MAC-адрес устройства, в зависимости от флага TxAdd в заголовке первого пакета Advertisement data.
Таким образом, если разместить Bluetooth-маячок, который запоминает сканирующие его устройства, то это позволяет владельцу маячка знать о местоположении смартфонов. По этой причине Android требует это разрешение, ведь действительно активное сканирование может дать другим информацию о вашем местоположении.
А вот дальше вступает в дело реализация вендора. Android требует разрешение, а не информацию о местопложении. Некоторые вендоры действительно не возвращают результаты поиска, если GPS отключен, но некоторые возвращают, при чём это может разниться от разных версий Android для одной и той же модели у одного и того же вендора.

На самом деле интересно, chrome вряд ли смог обойти ограничения на уровне OS.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации