Настройки блютуз на андроид для разработчиков
Проблема 1. В разделе Для разработчиков параметры Аудиокодек Bluetooth , Частота дискретизации Bluetooth-аудио , Разрядность Bluetooth-аудио и Режим аудиоканала Bluetooth неактивны, их невозможно настроить.
Причины и решение
Возможно, вы не подключили к вашему телефону Bluetooth-устройство. Подключите к вашему телефону Bluetooth-устройство и проверьте, решена ли проблема.
Проблема 2. Когда телефон подключен к Bluetooth-устройству, некоторые опции параметра Аудиокодек Bluetooth (AAC, aptX, aptXHD, LDAC и HWA) неактивны и их невозможно выбрать.
Причины и решение
Если Bluetooth-устройство не поддерживает определенные форматы медиакодеков Bluetooth, вы не сможете выбрать эти форматы в разделе Аудиокодек Bluetooth . В этом случае выберите формат, которые поддерживает Bluetooth-устройство.
- Форматы медиакодеков Bluetooth, поддерживаемые Bluetooth-устройством, можно узнать у производителя устройства.
- Форматы медиакодеков Bluetooth, поддерживаемые телефонами Huawei, можно узнать на официальном веб-сайте HUAWEI, в разделе для потребителей, или у специалистов службы поддержки клиентов Huawei.
Аудиокодек HWA
- На некоторых моделях телефонов с поддержкой HWA (телефоны с интерфейсом EMUI 9.1/Magic UI 2.1, поступившие в продажу в середине июля 2019 года) опция HWA доступна только при подключении Bluetooth-устройств с поддержкой HWA 2.0 и выше.
- На Bluetooth-устройствах с поддержкой только HWA 1.0, например на плеере HiFiMAN R2R-2000 (уточните у производителя Bluetooth-устройства), необходимо обновить прошивку до версии, которая поддерживает HWA 2.0 и выше. По вопросу обновления прошивки обращайтесь в службу поддержки производителя Bluetooth-устройства или ищите информацию на его официальном веб-сайте.
Проблема 3. Опции Качество воспроизведения HWA Bluetooth-аудио и Задержка HWA Bluetooth-аудио неактивны, их нельзя выбрать.
Причины и решение
Эти две опции активны, только если и телефон, и Bluetooth-устройство оба поддерживают HWA.
Режим разработчика на Android скрывает расширенный набор настроек, полезных как Android-девелоперам, так и обычным пользователям.
Расскажем о 7 самых неочевидных функциях режима, которые помогут ускорить девайс, очистить ОЗУ и настроить звучание Bluetooth-наушников.
Отключение анимации
За плавный запуск приложений, доступ к шторке уведомлений и переход между окнами на рабочем столе отвечает анимация интерфейса. Ее полное отключение уменьшает нагрузку на смартфон — наиболее актуально для бюджетных девайсов.
Достаточно перейти в раздел "Рисование" и включить "Без анимации" в:
- Анимация окон.
- Анимация переходов.
- Длительность анимации.
Лимит фоновых процессов
Продолжая тему ускорения слабых девайсов, упомянем о возможности ограничить лимит фоновых процессов, сэкономив заряд батареи и ОЗУ. Эта надстройка находится в разделе "Приложения" и позволяет выбрать между:
- Стандартным ограничением.
- Без фоновых процессов.
- Не более 1-4 процессов.
Работающие приложения
Больше информации о расходе оперативной памяти узнают из "Работающих приложений" в разделе "Система". Здесь отображается общий, занятый системой, приложениями и свободный объем ОЗУ. Активные приложения и процессы в кэше разрешают остановить, освобождая оперативку.
Обработка графики
Раздел "Аппаратное ускорение визуализации" скрывает две полезных функции:
- "GPU-ускорение" — после активации за отрисовку 2D-изображения, элементов интерфейса, видеороликов начнет отвечать графическое ядро, вместо центрального процессора. На практике, это дает небольшой прирост производительности за счет распределения нагрузки.
- "Включить 4x MSAA" — это множественное сглаживание в играх/приложениях, которое использует графическую библиотеку OpenGL ES 2.0. Говоря простым языком, текстуры в играх становятся более детализированными, за счет увеличения потребляемой мощности смартфона.
Недостаток обеих функций — ускоренный расход батареи с преждевременным появлением троттлинга в требовательных проектах.
Настройка Bluetooth-наушников
Подключенные Bluetooth-наушники из-за проблем с определением смартфона могут работать не в "полную силу". Изменяет ситуацию раздел "Сети", где устанавливают:
- Версию AVRCP;
- Выбранный аудиокодек;
- Частоту дискретизации;
- Глубину кодирования;
- Режим аудиоканала;
- Битрейт кодека LDAC.
Стабильный доступ к сети
После настройки наушников активным пользователям интернета предлагают включить:
- Переключение на мобильную сеть — автоматически переключитесь на 3G/4G при слабом Wi-Fi.
- Не отключать передачу данных — мобильный интернет останется включенным при активном Wi-Fi, что обеспечивает быстрое переключение между сетями. Актуально мобильным геймерам или блогерам.
Режим отладки
Отладка по USB — обязательная функция для Android-разработчиков. С ее помощью тестируют написанные приложения, получают Root-права или меняют прошивку устройства.
Радует, что сейчас эти опции доступны большому количеству людей. Даже если опыта в программировании нет, можно быстро получить его. В этом поможет обучение в онлайн-университете GeekBrains , где доступно много бесплатных материалов для изучения и интенсивов. Онлайн-университет предлагает занятия с преподавателями-практиками из крупнейших компаний, а по окончании курса выдается сертификат о выпуске с государственной лицензией.
Если нет понимания, какое именно направление вас интересует, поможет Тест на определение профессии из 10 вопросов . Например, мой результат — аналитик.
Могу точно сказать – это было сложней, чем представлял, мне пришлось приложить немало усилий для стабильной работы под Android. Я изучил много статей в свободном доступе, некоторые оказались ошибочными, многие были очень полезными и помогли в деле. В этой серии статей я хочу описать свои выводы, чтобы вы не тратили уйму времени на поиски как я.
Особенности работы BLE под Android
Google документация по BLE очень общая, в некоторых случаях нет важной информации или она устарела, примеры приложений не показывают, как правильно использовать BLE. Я обнаружил лишь несколько источников, как правильно сделать BLE. Презентация Stuart Kent дает замечательный материал для старта. Для некоторых продвинутых тем есть хорошая статья Nordic.
Android BLE API это низкоуровневые операции, в реальных приложениях нужно использовать несколько слоев абстракции (как например сделано «из коробки» в iOS-CoreBluetooth). Обычно нужно самостоятельно сделать: очередь команд, bonding, обслуживание соединений, обработка ошибок и багов, мультипоточный доступ . Самые известные библиотеки: SweetBlue, RxAndroidBle и Nordic. На мой взгляд самая легкая для изучения - Nordic, см. детали тут.
Производители делают изменения в Android BLE стеке или полностью заменяют на свою реализацию. И надо учитывать разницу поведения для разных устройств в приложении. То что прекрасно работает на одном телефоне, может не работать на других! В целом не все так плохо, например реализация Samsung сделана лучше собственной реализации от Google!
В Android есть несколько известных (и неизвестных) багов которые должны быть обработаны, особенно в версиях 4,5 и 6. Более поздние версии работают намного лучше, но тоже имеют определенные проблемы, такие как случайные сбои соединения с ошибкой 133. Подробнее об этом ниже.
Не претендую на то, что я решил все проблемы, но мне удалось выйти на «приемлемый» уровень. Начнем со сканирования.
Сканирование устройств
Перед подключением к устройству вам нужно его просканировать. Это делается при помощи класса BluetoothLeScanner :
Сканер пытается найти устройства в соответствии с настройками filters и scanSettings , при обнаружении устройства вызывается scanCallback :
В результате сканирования мы получаем экземпляр ScanResult , в котором есть объект BluetoothDevice , его используют для подключения к устройству. Но прежде чем начать подключаться, поговорим о сканировании подробнее, ScanResult содержит несколько полезных сведений об устройстве:
Advertisement data - массив байтов с информацией об устройстве, для большинства устройств это имя и UUID сервисов, можно задать в filters имя устройства и UUID сервисов для поиска конкретных устройств.
RSSI уровень - уровень сигнала (насколько близко устройство).
… дополнительные данные, см. документацию по ScanResult здесь.
Помним про жизненный цикл Activity , onScanResult может вызываться многократно для одних и тех же устройств, при пересоздании Activity сканирование может запускаться повторно, вызываю лавину вызовов onScanResult .
Настраиваем фильтр для сканирования
Вообще можно передать null вместо фильтров и получить все ближайшие устройства, иногда это полезно, но чаще требуются устройства с определенным именем или набором UUID сервисов.
Сканирование устройств по UUID сервиса
Используется если вам необходимо найти устройства определенной категории, например мониторы артериального давления со стандартным сервисным UUID: 1810. При сканировании устройство может содержать в Advertisement data UUID сервис, который характеризует это устройство. На самом деле эти данные ненадежные, фактически сервисы могут не поддерживаться, или подделываться Advertisement data данные, в общем тут есть творческий момент.
Прим. переводчика: одно из моих устройств со специфичной прошивкой, вообще не содержало список UUID сервисов в Advertisement data, хотя все остальные прошивки этого устройства работали ожидаемо.
Пример сканирования службы с артериальным давлением:
Сканирование устройств по имени
Поиск устройств использует точное совпадение имени устройства, обычно это применяется в двух случаях:
поиск конкретного устройства
поиск конкретной модели устройства, например, мой нагрудный напульсник Polar H7 определяется как «Polar H7 391BBB014», первая часть - «Polar H7» общая для всех таких устройств этой модели, а последняя часть «391BBB014» - уникальный серийный номер. Это очень распространенная практика. Если вы хотите найти все устройства «Polar H7», то фильтр по имени вам не поможет, придется искать подстроку у всех отсканированных устройств в ScanResult . Пример с поиском точно по имени:
Сканирование устройств по MAC-адресам.
Обычно применяется для переподключения к уже известным устройствам. Обычно мы не знаем MAC-адрес девайса, если не сканировали его раньше, иногда адрес печатается на коробке или на корпусе самого устройства, особенно это касается медицинских приборов. Существует другой способ повторного подключения, но в некоторых случаях придется еще раз сканировать устройство, например при очистке кеша Bluetooth.
Вероятно вы уже поняли, что можно комбинировать в фильтре UUID, имя и MAC-адрес устройства. Выглядит неплохо, но на практике я не применял такое. Хотя может быть вам это пригодится.
Настройка ScanSettings
ScanSettings объясняют Android как сканировать устройства. Там есть ряд настроек, которые можно задать, ниже полный пример:
ScanMode
Безусловно, это самый важный параметр. Определяет метод и время сканирования в Bluetooth стеке. Такая операция требует много энергии и необходим контроль над этим процессом, чтобы не разрядить батарею телефона быстро. Есть 4 режима работы, в соответствии с руководством Nordics и официальной документацией:
SCAN_MODE_LOW_POWER . В этом режиме Android сканирует 0.5с, потом делает паузу на 4.5с. Поиск может занять относительно длительное время, зависит от того насколько часто устройство посылает пакет advertisement данных.
SCAN_MODE_BALANCED . Время сканирования: 2с, время паузы: 3с, «компромиссный» режим работы.
SCAN_MODE_LOW_LATENCY . В этом случае, Android сканирует непрерывно, что очевидно требует больше энергозатрат, при этом получаются лучшие результаты сканирования. Режим подходит если вы хотите найти свое устройство как можно быстрее. Не стоит использовать для длительного сканирования.
SCAN_MODE_OPPORTUNISTIC . Результаты будут получены, если сканирование выполняется другими приложениями! Строго говоря, это вообще не гарантирует, что обнаружится ваше устройство. Стек Android использует этот режим в случае долгого сканирования, для понижения качества результатов (см. ниже «Непрерывное сканирование»).
Callback Type
Эта настройка контролирует как будет вызываться callback со ScanResult в соответствии с заданными фильтрами, есть 3 варианта:
CALLBACK_TYPE_ALL_MATCHES . Callback будет вызывать каждый раз, при получении advertisement пакета от устройств. На практике - каждые 200-500мс будет срабатывать сallback, в зависимости от частоты отправки advertisement пакетов устройствами.
CALLBACK_TYPE_FIRST_MATCH . Callback сработает один раз для устройства, даже если оно далее будет снова посылать advertisement пакеты.
CALLBACK_TYPE_MATCH_LOST . Callback будет вызван, если получен первый advertisement пакет от устройства и дальнейшие advertisement пакеты не обнаружены. Немного странное поведение.
В практике обычно используются настройка CALLBACK_TYPE_ALL_MATCHES или CALLBACK_TYPE_FIRST_MATCH . Правильный тип зависит от конкретного случая. Если не знаете - используйте CALLBACK_TYPE_ALL_MATCHES , это дает больше контроля при получении callback, если вы останавливаете сканирование после получения нужных результатов - фактически это CALLBACK_TYPE_FIRST_MATCH .
Match mode
Настройка того, как Android определяет «совпадения».
MATCH_MODE_AGGRESSIVE . Агрессивность обуславливается поиском минимального количества advertisement пакетов и устройств даже со слабым сигналом.
MATCH_MODE_STICKY . В противоположность, этот режим требует большего количества advertisement пакетов и хорошего уровня сигнала от устройств.
Я не тестировал эти настройки подробно, но я в основном использую MATCH_MODE_AGGRESSIVE , это помогает быстрее найти устройства.
Number of matches
Параметр определяет сколько advertisement данных необходимо для совпадения.
MATCH_NUM_ONE_ADVERTISEMENT . Одного пакета достаточно.
MATCH_NUM_FEW_ADVERTISEMENT . Несколько пакетов нужно для соответствия.
MATCH_NUM_MAX_ADVERTISEMENT . Максимальное количество advertisement данных, которые устройство может обработать за один временной кадр.
Нет большой необходимости в таком низкоуровневом контроле. Все что вам надо - быстро найти свое устройство, обычно используются первые 2 варианта.
Report delay
Задержка для вызова сallback в миллисекундах. Если она больше нуля, Android будет собирать результаты в течение этого времени и вышлет их сразу все в обработчике onBatchScanResults . Важно понимать что onScanResult не будет вызываться. Обычно применяется, когда есть несколько устройств одного типа и мы хотим дать пользователю выбрать одно из них. Единственная проблема здесь - предоставить информацию пользователю для выбора, это должен быть не только MAC-адрес (например имя устройства).
Важно: есть известный баг для Samsung S6 / Samsung S6 Edge, когда все результаты сканирования имеют один и тот же RSSI (уровень сигнала) при задержке больше нуля.
Кеширование Android Bluetooth стека
В результате процесса сканирования вы получаете список BLE устройств и при этом данные устройств «кешируются» в Bluetooth стеке. Там хранится основная информация: имя, MAC-адрес, тип адреса (публичный, случайный), тип устройства (Classic, Dual, BLE) и т.д. Android нужны эти данные, чтобы подключится к устройству быстрее. Он кеширует все устройства, которые видит при сканировании. Для каждого из них записывается небольшой файл с данными. Когда вы пытаетесь подключиться к устройству, стек Android ищет соответствующий файл, чтобы прочитать данные для подключения. Важный момент - одного MAC-адреса недостаточно для успешного подключения к устройству!
Очистка кеша
Bluetooth кеш, как и любой другой, не существует вечно, есть 3 ситуации, когда он очищается:
Выключение и включение системного переключателя Bluetooth
Очистка данных приложения (в ручном режиме в настройках телефона)
Это достаточно неудобный момент для разработчиков, потому что телефон часто перезагружается, пользователь может включать-выключать самолетный режим. Есть еще различия между производителями телефонов, например на некоторых телефонах Samsung, кеш не очищался при выключении Bluetooth.
Это значит, что нельзя полагаться на данные об устройстве из BT кеша. Есть небольшой трюк, он поможет узнать закешировано ли устройство или нет:
Это важный момент, если нужно подключиться к устройству позже, не сканируя его. Подробнее об этом позже.
Непрерывное сканирование?
Вообще хорошая практика – избегать непрерывного сканирования потому что, это очень энергоемкая операция, а пользователи любят, когда батарея их смартфона работает долго. Если вам действительно нужно постоянное сканирование, например при поиске BLE-маячков, выберите настройки сканирования с низким потреблением и ограничивайте время сканирования, например когда приложение находится только на переднем плане (foreground), либо сканируйте с перерывами.
Плохая новость в том, что Google в последнее время ограничивает (неофициально) непрерывное сканирование:
c Android 8.1 сканирование без фильтров блокируется при выключенном экране. Если у вас нет никаких ScanFilters , Android приостановит сканирование, когда экран выключен и продолжит, когда экран снова будет включен. Комментарии от Google. Это очевидно очередной способ энергосбережения от Google.
c Android 7 вы можете сканировать только в течение 30 минут, после чего Android меняет параметры на SCAN_MODE_OPPORTUNISTIC . Очевидное решение, перезапускать сканирование с периодом менее, чем 30 мин. Посмотрите commit в исходном коде.
с Android 7 запуск и останов сканирования более 5 раз за 30 секунд временно отключает сканирование.
Непрерывное сканирование в фоне
Google значительно усложнил сканирование на переднем плане. Для фонового режима вы столкнетесь с еще большими трудностями! Новые версии Android имеют лимиты на работу служб в фоновом режиме, обычно после 10 минут работы, фоновый сервис прекращает свою работу принудительно. Посмотрите возможные решения этой проблемы:
Проверка разрешений (permissions)
Есть еще несколько важных моментов, прежде чем мы закончим статью. Для начала сканирования нужны системные разрешения (permissions):
Убедитесь, что все разрешения одобрены, или запросите их у пользователя. Разрешение ACCESS_COARSE_LOCATION Google считает «опасным» и для него требуется обязательное согласие пользователя.
Прим. переводчика, в моем проекте для корректной работы с BLE потребовалось еще 2 разрешения: ACCESS_FINE_LOCATION (для API<23) и ACCESS_BACKGROUND_LOCATION обсуждение на Stackoverflow.
В итоге полный список разрешений включая версию Android10:
После получения всех нужный разрешений, нужно проверить включен Bluetooth, если нет - используйте Intent для запуска запроса на включение:
Заключение
Мы научились запускать сканирование BLE устройств с учетом жизненного цикла Activity (Fragment / Service), использовать фильтры и различные настройки сканирования, также узнали все нужные разрешения (permissions) для удачного запуска сканирования и особенности работы Android-Bluetooth кеша. В следующей статье мы погрузимся глубже в процесс подключения и отключения к устройствам.
Технологию Bluetooth сегодня использует каждый второй владелец смартфона для сопряжения с другими устройствами. Но только единицами пользователей проводится специальная настройка Bluetooth на Android, которая помогает на порядок быстрее находить стабильную связь с устройствами. В этой статье рассматриваются главные настройки Bluetooth-соединения и его оптимизации для дальнейшего комфортного использования.
Возможности технологии Bluetooth на Android
Для сопряжения устройств через Bluetooth не используется интернет-трафик, необходимо просто наличие двух устройств с исправными модулями.
С появлением и развитием Wi-Fi популярность технологии Bluetooth не уменьшилась, потому что она использует на порядок меньше энергоресурсов. По этой причине создаются беспроводные наушники, спортивные браслеты, умные часы и другие Bluetooth-устройства.
Настройка Bluetooth на Android-устройствах
При правильной настройке Bluetooth-модуля можно получить максимальный уровень комфорта от использования: быстрое сопряжение с другими аксессуарами, высокую скорость передачи данных. Пользователь, который знает, как настроить на Android Bluetooth, получает ускорение и стабилизацию процесса передачи любых файлов начиная от рабочих документов и заканчивая отснятыми видеоматериалами.
Включение модуля Bluetooth
Наладка любого оборудования, работающего под управлением операционной системы Android, начинается непосредственно с его активации, то есть нужно включить Bluetooth на планшете Android. Для этого следует открыть меню настроек, найти раздел Bluetooth и передвинуть ползунок вправо.
Некоторые настройки модуля станут доступными только после того, как вы активируете передатчик.
Переименование устройства
При выборе пункта меню «Переименование устройства», можно изменить стандартное название гаджета на более узнаваемое, которое будет отображаться на других девайсах в процессе сопряжения или в момент передачи данных.
Видимость устройства
В целях безопасности все Android-устройства изначально находятся в невидимом положении. Данная настройка изменяется только на время, достаточное для поиска и сопряжения двух устройств. В ранних версиях операционной системы Android данную функцию пользователю приходилось включать вручную.
В настоящий момент можно просто зайти в настройки Bluetooth, устройство автоматически перейдет в видимый режим. Далее дождаться, пока гаджет оппонента отсканирует сеть на наличие доступных устройств.
Настройка сопряженных девайсов
При первом подключении к любому устройству система Android предлагает наладить сопряжение. Стоит согласиться, так как впоследствии больше не придется сканировать систему и заставлять оппонента переходить в видимый режим для соединения.
Сопряженные устройства могут передавать данные друг другу, даже находясь в невидимом режиме. При этом для удобства в настройках сопряженных устройств можно изменить имя того или иного гаджета.
Другие настройки сопряжения остаются недоступными даже для пользователей с рутированными устройствами (с полными правами на использование).
Просмотр полученных данных
Полезной настройкой модуля Bluetooth является пункт «Полученные файлы». Данная настройка переносит пользователя в папку, куда сохраняются все файлы с других устройств, полученных через Bluetooth.
Эта директория создается по умолчанию на внутреннем накопителе устройства. При желании все файлы из этой директории можно переместить в другие разделы, например, на внешний накопитель.
Удобство данной функции заключается в получении доступа к данным без затрат времени на поиски диспетчером файлов. При ее выборе открывается полный перечень ранее полученной информации.
Использование инженерного меню для настройки Bluetooth-модуля
Инженерное меню – это инструмент, который используют разработчики программного обеспечения в финальных корректировках перед выпуском системы. Настройка Bluetooth в инженерном меню Android должна остаться без изменений, если вы не обладаете надлежащими знаниями и опытом.
В разделе информации об устройстве найдите установки Bluetooth-модуля. Запустите повторное сканирование и измените параметры поиска. Но лучше отказаться от столь опрометчивых шагов, так как любые изменения могут привести к серьезным ошибкам.
Обновление Bluetooth-модуля на Android
Обновление Bluetooth-модуля может быть программным и аппаратным. В первом случае все модернизации зачастую вносятся разработчиками программного обеспечения и заливаются на гаджет вместе с обновлениями системы.
Читайте также: