Подключиться к bluetooth java android

Обновлено: 21.11.2024

Большую часть двух дней я провел, работая над Bluetooth-подключением для разрабатываемого мной приложения для Android. У меня практически не было опыта работы с Bluetooth, особенно на Android. Я быстро обнаружил некоторые особенности Bluetooth API платформы.

Помимо подключения к устройствам Bluetooth, клиент хотел выполнить сопряжение и разрыв сопряжения с приложением. Простым выходом и, вероятно, Android Way™, было бы переложить эту ответственность на ОС, а-ля Намерение:

Откроется меню настроек Bluetooth, из которого вы можете соединять/разъединять устройства, но проблема в том, что это полное переключение контекста для пользователя — они больше не находятся в вашем приложении. Я стремился обеспечить более удобный интерфейс, чтобы пользователю вообще не приходилось выходить из приложения для сопряжения устройства.

Обнаружение устройств

Точка входа для взаимодействия Bluetooth в Android — BluetoothAdapter, который используется для координации процесса обнаружения устройств и получения сопряженных устройств. Вызов startDiscovery() сообщит адаптеру, что нужно начать поиск устройств, и когда одно из них будет найдено, будет запущен Intent, который затем может быть перехвачен BroadcastReceiver.

Приведенный выше код показывает, как запускается процесс обнаружения устройства и как регистрируется BroadcastReceiver для прослушивания намерений обнаружения. Обратите внимание, что BroadcastReceiver не зарегистрирован, а обнаружение отменено в onDestroy.

Чтобы реагировать на события обнаружения, мы должны реализовать BroadcastReceiver.

Сопряжение устройств

Если у вас есть дескриптор BluetoothDevice, полученный в BroadcastHandler, как вы на самом деле подключаетесь к нему? Глядя на документацию к классу, вы увидите, что для этого нет методов. Здесь все становится немного странным.

Погрузившись в исходный код BluetoothDevice, вы обнаружите, что есть функциональные возможности для создания и отключения сопряжения, но методы скрыты от API с помощью @hide аннотация. Что еще интереснее, эти методы на самом деле являются общедоступными.

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

Чтобы получить доступ к необходимым методам BluetoothDevice, createBond и removeBond, мы можем использовать отражение.

МетодpairDevice предложит пользователю ввести PIN-код для обнаруженного устройства без необходимости открывать настройки Bluetooth. Таким образом, сопряжение фактически не завершается, пока не будет введен правильный PIN-код. Логическое значение, возвращаемое методом, указывает, был ли успешно запущен процесс связывания.

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

Мы можем добавить фильтр Intent в наш BroadcastReceiver для прослушивания событий сопряжения с помощью действия BluetoothDevice.ACTION_BOND_STATE_CHANGED.

В BluetoothDevice есть несколько других скрытых методов, таких как cancelPairingUserInput, setPairingConfirmation, convertPinToBytes и setPin, которые потенциально можно использовать для настройки процесса сопряжения или выполнения его программно, но используйте их на свой страх и риск.

После сопряжения устройств их можно подключить с помощью одного из методов createRfcommSocketToServiceRecord или createInsecureRfcommSocketToServiceRecord устройства BluetoothDevice после определения используемого UUID либо с помощью getUuids, либо с помощью fetchUuidsWithSdp (или, в большинстве случаев, с помощью известного UUID 00001101-0000- 1000-8000-00805F9B34FB).

Вполне вероятно, что Bluetooth API Android скоро изменится. Это уже изменилось в некоторых из последних выпусков, хотя я не совсем понимаю, почему Google не предоставляет стабильный API для сопряжения. В Jelly Bean 4.2 представлен новый стек Bluetooth, переход от BlueZ к решению Broadcom, поэтому я предполагаю, что это связано с этим.

Реализация сканирования путей к классам в стиле Spring в Android

Одной из возможностей, представленных в Spring 2.5 еще в 2007 году, было сканирование компонентов. Эта функция устранила необходимость в настройке компонентов XML и вместо этого позволила разработчикам объявлять свои компоненты с помощью аннотаций Java. Вместо этого:

Это довольно простая идея, поскольку Java позволяет очень легко интроспективно проверять аннотации класса во время выполнения с помощью API отражения. Функция сканирования компонентов Spring также позволяет указать базовые пакеты для сканирования компонентов.

Большой вопрос заключается в том, как получить доступ к классам в пути к классам, в частности к тем, которые находятся в нужном пакете? Java SE не предоставляет API для этого, но есть способы сделать это. Самый распространенный (если не единственный) подход — загружать классы, полагаясь на файловую систему. Мы знаем, что можем использовать ClassLoader для загрузки класса по его имени, указанному в пакете, поэтому это становится вопросом получения имен файлов.

Получить путь к классам в Java SE очень просто:

Это даст что-то вроде «/Users/Tyler/Workspace/Test/bin:/Users/Tyler/Workspace/Test/lib/gson-2.1.jar». Загрузка файлов отсюда довольно проста, так же как и фильтрация по имени пакета, поскольку оно однозначно сопоставляется с каталогом.

Другой похожий подход — использовать ClassLoader для прямой загрузки ресурсов:

Переход на Android

К сожалению, эти решения не подходят для Android, что несколько усложнило реализацию сканирования путей к классам для Infinitum. Причина этого более или менее кроется в том, как устроена виртуальная машина Android Dalvik. Когда приложение для Android компилируется, байт-код Dalvik упаковывается в файл с именем «classes.dex» внутри APK. Хорошая новость заключается в том, что Android SDK предоставляет API для взаимодействия с файлами DEX через класс DexFile.

Чтобы получить доступ к classs.dex, нам нужен дескриптор самого APK, что на самом деле довольно легко сделать:

Приведенный выше код открывает файл DexFile для работающего APK. Конечно, это может повлиять на производительность. Открытие DexFile может привести к тому, что виртуальная машина пропустит class.dex через процесс, известный как «dexopt», который представляет собой программу, выполняющую проверку и оптимизацию байт-кода. Это дорогостоящий процесс, но, поскольку мы открываем DexFile для самого APK, class.dex уже должен был пройти этот процесс, а это означает, что dexopt не будет запускаться снова.

DexFile предоставляет нам доступ к классам, содержащимся в class.dex, в виде перечисления строк, представляющих имена классов с указанием пакета. При этом мы можем перебирать имена классов и загружать те, которые соответствуют желаемому пакету.

Это выполняет свою работу, и, по сути, именно так Infinitum выполняет сканирование компонентов. Однако это очень дорогая операция. DexFile.entries() возвращает каждый класс в пути к классам, то есть каждый класс в classs.dex, включая не только двоичные файлы приложений, но и любые включенные библиотеки.

Замечательно, что мы можем исследовать каждый класс в пути к классам, но если нас интересуют только классы определенного пакета, нам не повезло. Каждый класс компилируется в class.dex, и, если не считать его декомпиляции1, нет никакого способа извлечь нужные классы без перебора всего пути к классам.

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

  1. Существуют инструменты для декомпиляции файлов DEX, такие как Baksmali, но выполнение таких действий во время выполнения — если это вообще возможно — возможно, не принесет вам никаких преимуществ в производительности. Тем не менее, это то, что стоит изучить. [↩]
  2. На эмуляторе, работающем на моем MacBook Pro, сканирование пути к классам занимает около 600 миллисекунд, а на моем Galaxy Nexus — около 200 миллисекунд. [↩]

Вот вам порция бесстыдной саморекламы. Приближается год с тех пор, как я начал разработку Infinitum, и я планирую его первый полный релиз в день его рождения, 11 февраля. Незадолго до того, как я переместил проект на GitHub, они объявили устаревшим сервис загрузки, поэтому мне нужно было оштрафовать домой для распространения двоичных файлов, а также Javadoc.

Оставайтесь с нами, поскольку Infinitum приближается к своему первому официальному релизу!

Модулизация Infinitum: вскрытие

Помимо переноса кода из Google Code в GitHub, одним из моих проектов в праздничные дни была модульная структура платформы Infinitum для Android, над которой я работал в прошлом году.

Infinitum начинался как SQLite ORM и быстро расширился, включив в себя реализацию REST ORM, клиент REST, оболочку ведения журналов, платформу DI, модуль AOP и, конечно же, все инструменты платформы, необходимые для поддержки этих различных функций. Он развивался по мере того, как я добавлял все больше и больше функций полуслучайным образом. В мою защиту код был организован. Это было логично. Это имело смысл. Не было метода, но не было и безумия. Все было в пакете с соответствующим названием. Все было закодировано в интерфейсе. Дублированного кода не было.Однако модульность — с точки зрения минимизации зависимостей от фреймворка — в то время не рассматривалась, и весь код был в одном проекте.

Дикий, Дикий Запад

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

То, что начиналось как инфраструктура ORM, превратилось в инфраструктуру REST, которая превратилась в инфраструктуру ведения журналов, затем в инфраструктуру IOC, а затем в инфраструктуру AOP. Все эти функции, созданные с нуля, были связаны друг с другом с помощью контекста, который предоставлял данные о конфигурации платформы. Что еще более важно, в контексте Infinitum хранится фабрика компонентов, используемая для хранения и извлечения определений компонентов, используемых как инфраструктурой, так и клиентом. Сами разные модули не были тесно связаны, но они были связаны с контекстом, как перья на птице.

Фреймворк начал разрастаться. Это было всего около 300 КБ фактического кода (JARed без сжатия ProGuard), но он имел ряд зависимостей от библиотек, а именно Dexmaker, Simple XML и GSON, общий размер которых превышает 1 МБ. Поскольку это фреймворк для Android, я хотел, чтобы площадь занимаемого места была как можно меньше. Кроме того, вполне вероятно, что кто-то не будет использовать все функции платформы. Может быть, им просто нужен SQLite ORM, или просто клиент REST, или просто внедрение зависимостей. Платформа была структурирована таким образом, что они должны были либо принять все, либо ничего.

Художник ищет кисть

Я начал искать способы его модульности. Как я показал, главная проблема заключалась в том, что контекст Infinitum знал обо всех различных модулях и отвечал за вызов и настройку их API. Если ORM является необязательной зависимостью, контекст не должен знать об этом. Как можно отделить модули от контекста?

Очевидно, что существует основная зависимость, Infinitum Core, которая состоит из основных элементов инфраструктуры. Эти вещи используются во всей структуре во всех модулях — ведение журнала, DI1, исключения и разные утилиты. Цель состояла в том, чтобы реализовать модули ORM, REST и AOP.

Первоначальный подход заключался в том, чтобы попытаться использовать шаблон декоратора, чтобы «украсить» контекст Infinitum дополнительными функциями. OrmContextDecorator будет реализовывать методы, специфичные для ORM, AopContextDecorator будет реализовывать методы, специфичные для AOP, и так далее. Проблема заключалась в том, что для этого по-прежнему требовалось, чтобы методы, специфичные для модуля, были объявлены в интерфейсе контекста Infinitum. Мало того, что они должны быть заглушены в реализации контекста, многие интерфейсы модулей должны быть перемешаны и помещены в Infinitum Core, чтобы удовлетворить компилятор. Проблема осталась; контекст по-прежнему знал обо всех модулях.

У меня была другая идея. Возможно, я мог бы превратить контекст Infinitum из единой точки конфигурации в иерархическую структуру, в которой каждый модуль имеет свой собственный контекст как «потомок» корневого контекста. Интерфейс OrmContext может расширить интерфейс InfinitumContext, предоставляя специфичные для ORM функции, но при этом наследуя основные методы контекста. В этом случае реализация будет содержать ссылку на родительский контекст, поэтому, если она не может выполнить определенную часть функций, она может делегировать родительскому контексту. Это может сработать. Контекст Infinitum не имеет понятия модуля X, Y или Z, и, по сути, управление инвертировано. Можно назвать это голливудским принципом: «Не звоните нам, мы позвоним вам».

Остается еще один вопрос: как идентифицировать «дочерние» контексты и впоследствии их инициализировать? Решение состоит в том, чтобы поддерживать реестр модулей. Этот реестр будет отслеживать дополнительные зависимости фреймворка и отвечает за их инициализацию, если они доступны. Мы используем класс-маркер из каждого модуля, класс, который, как мы знаем, существует, если зависимость включена в путь к классам, чтобы проверить его доступность.

Наконец, мы используем отражение для создания экземпляра контекста модуля. Я использовал перечисление для ведения реестра модулей Infinitum.Затем я расширил перечисление, добавив метод initialize, который загружает экземпляр контекста.

Модули извлекаются на этапе постобработки в ContextFactory. Именно на этом шаге они также добавляются в качестве дочерних контекстов к родительскому.

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

Мы формируем наши здания, а потом наши здания формируют нас

Я думаю, что это решение помогло немного минимизировать некоторые сложности. Как и любая модульная конструкция, она не только более расширяема, но и более удобна в сопровождении. Контекст каждого модуля отвечает за свою собственную конфигурацию, так что это, безусловно, помогло уменьшить сложность реализации InfinitumContext, поскольку раньше он обрабатывал инициализацию для частей ORM, AOP и REST. Сработало и то, что я перешел на GitHub2, настроив четыре отдельных репозитория, по одному для каждого модуля.

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

  1. Изначально я надеялся выделить внедрение зависимостей в отдельный модуль, но фреймворк в значительной степени полагается на него для подключения компонентов. [↩]
  2. Теперь, когда код отправлен на GitHub, я приступаю к трудоемкой задаче переноса документации из Google Code. [↩]

Генерация байт-кода Dalvik

Ранее я обсуждал использование динамических прокси-серверов и то, как их можно реализовать в Java. Как мы видели, необходимой частью классов проксирования является генерация байт-кода. С самого начала я хотел включить в Infinitum ленивую загрузку. Я также хотел обеспечить поддержку АОП в будущем. Следовательно, было важно включить какой-либо способ генерации байт-кода во время выполнения.

Очевидным выбором было бы использование такой библиотеки, как Cglib или Javassist, но, к сожалению, ни одна из них не будет работать. Это связано с тем, что Android не использует виртуальную машину Java, а использует собственную виртуальную машину с именем Dalvik. В результате исходный код Java компилируется не в байт-код Java (файлы .class), а в байт-код Dalvik (файлы .dex). Поскольку Cglib и Javassist предназначены для работы с байт-кодом Java, они не работают на платформе Android1.

Что должен делать программист? К счастью, некоторые сотрудники Google разработали новую библиотеку Dexmaker для генерации кода во время выполнения для виртуальной машины Dalvik.

У него есть небольшой, практически готовый API. Этот API отражает спецификацию байт-кода Dalvik, что дает вам жесткий контроль над генерируемым байт-кодом. Код генерируется по инструкции; вы приносите свое собственное абстрактное синтаксическое дерево, если оно вам нужно. А поскольку в качестве серверной части используется инструмент dx от Dalvik, вы бесплатно получаете эффективное распределение регистров и выбор обычных/широких инструкций.

Более того, Dexmaker предоставляет API для прямого создания прокси-серверов под названием ProxyBuilder. Если вы следовали моему предыдущему сообщению о создании прокси, то использовать ProxyBuilder несложно. Подобно классу Proxy в Java, ProxyBuilder полагается на InvocationHandler для указания поведения прокси.

Dexmaker позволил мне реализовать отложенную загрузку и АОП в среде Infinitum. Это также открывает возможность использования Mockito для модульного тестирования в среде Android, поскольку Mockito использует прокси-серверы для создания макетов.2

В Android Bluetooth — это сетевой протокол связи, который позволяет устройствам подключаться по беспроводной сети для обмена данными с другими устройствами Bluetooth.

Как правило, в приложениях для Android с помощью API Bluetooth мы можем реализовать функции Bluetooth, такие как поиск доступных устройств Bluetooth, подключение к устройствам и управление передачей данных между устройствами в пределах диапазона.

Используя Android API Bluetooth в приложениях для Android, мы можем выполнять следующие функции.

  • Поиск доступных устройств Bluetooth в радиусе действия.
  • Использовать локальный адаптер Bluetooth для сопряженных устройств Bluetooth.
  • Подключение к другим устройствам с помощью службы обнаружения
  • Передача данных на другие устройства и с них
  • Управление несколькими подключениями

Чтобы сначала передать данные между двумя устройствами Bluetooth, они должны установить канал связи, используя процесс сопряжения. Устройства, которые мы собираемся соединить, должны быть доступны для обнаружения и должны принимать входящие запросы на подключение.Как правило, устройства находят обнаруживаемые устройства с помощью процесса обнаружения службы. Как только устройство примет запрос на сопряжение, два устройства обменяются электронными ключами для завершения процесса связывания, а устройства сохранят эти электронные ключи в кэше для последующего использования.

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

Установка разрешений Bluetooth для Android

Чтобы использовать функции Bluetooth в наших приложениях для Android, нам необходимо добавить несколько разрешений, например BLUETOOTH и ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION, в наш файл манифеста.

РазрешениеОписание
BLUETOOTH Нам нужно это разрешение для выполнения любой связи Bluetooth, например, для запроса соединения, принятия соединения и передачи данных.
МЕСТОПОЛОЖЕНИЕ Нам нужно это разрешение потому что сканирование Bluetooth может использоваться для сбора информации о местоположении пользователя.

В случае, если мы хотим обнаружить доступные устройства Bluetooth или управлять настройками Bluetooth из нашего приложения, нам необходимо определить разрешение BLUETOOTH_ADMIN.

Ниже приведен пример определения разрешений Bluetooth в файле манифеста Android.

манифест . >
использует-разрешение android :name= "android.permission.BLUETOOTH" />

использует-разрешение android :name= "android.permission.BLUETOOTH_ADMIN" />
< br />использует-разрешение android :name= "android.permission.ACCESS_COARSE_LOCATION" />

.

Класс Android BluetoothAdapter

В Android мы можем выполнять действия, связанные с Bluetooth, с помощью класса BluetoothAdapter в наших приложениях.

Используя объект BluetoothAdapter, мы можем взаимодействовать с адаптером Bluetooth устройства для выполнения операций, связанных с Bluetooth. В случае, если устройство не содержит Bluetooth-адаптера, будет возвращено значение null.

Ниже приведен фрагмент кода для инициализации класса BluetoothAdapter и определения того, поддерживается ли Bluetooth на устройстве.

BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
if (bAdapter== null )
// Устройство не поддерживает Bluetooth
>

Если вы заметили приведенный выше фрагмент кода, мы использовали метод getDefaultAdapter() класса BluetoothAdapter, который возвращает информацию о том, содержит ли устройство адаптер Bluetooth или нет.

Если метод getDefaultAdapter() возвращает NULL, то устройство не поддерживает Bluetooth, и мы можем отключить все функции Bluetooth.

Android Включить или отключить Bluetooth

Если Bluetooth поддерживается, но отключен, то метод isEnabled() вернет false, и мы можем попросить пользователя включить Bluetooth, не выходя из нашего приложения, используя метод startActivityForResult() с параметром действия намерения ACTION_REQUEST_ENABLE.

Ниже приведен фрагмент кода для включения Bluetooth с помощью параметра BluetoothAdapter ACTION_REQUEST_ENABLE.

if (!bAdapter.isEnabled())
Intent eintent = new Intent(BluetoothAdapter. ACTION_REQUEST_ENABLE );
startActivityForResult(eintent, intVal);
>

Если вы заметили приведенный выше фрагмент кода, мы использовали метод startActivityForResult() с параметром действия намерения ACTION_REQUEST_ENABLE для включения Bluetooth.

Второй параметр intVal в методе startActivityForResult() — это локально определенное целое число, которое должно быть больше 0, и система вернет этот параметр нам во время реализации onActivityResult() в качестве параметра requestCode.

Чтобы узнать больше о ВКЛЮЧЕНИИ/ВЫКЛЮЧЕНИИ Bluetooth в приложениях для Android, см. этот раздел Включение/выключение Bluetooth для Android с примерами.

Android обеспечивает возможность обнаружения

Чтобы сделать устройство доступным для обнаружения другими устройствами, нам нужно запустить новое действие, вызвав startActivityForResult(intent, int) с намерением ACTION_REQUEST_DISCOVERABLE.

Ниже приведен фрагмент кода для включения режима обнаружения системы, чтобы убедиться, что устройство доступно для обнаружения другими устройствами.

Намерение dIntent = новое намерение(BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE );
dIntent.putExtra(BluetoothAdapter. EXTRA_DISCOVERABLE_DURATION , 300 );
startActivity(dIntent);

Если вы заметили приведенный выше фрагмент кода, мы обеспечиваем возможность обнаружения нашего устройства другими устройствами с помощью ACTION_REQUEST_DISCOVERABLE. По умолчанию устройство становится доступным для обнаружения на 120 секунд. Мы можем увеличить продолжительность обнаружения устройства до 3600 секунд (1 час), добавив дополнительную EXTRA_DISCOVERABLE_DURATION.

Чтобы узнать больше об обнаружении устройств, ознакомьтесь с этой статьей Обнаружение устройств Android Bluetooth с примерами.

Список сопряженных устройств Android

Используя метод getBondedDevices() BluetoothAdapter, мы можем получить список сопряженных устройств Bluetooth.

Ниже приведен фрагмент кода для получения всех сопряженных устройств с именем и MAC-адресом каждого устройства.

// Получить сопряженные устройства.
Set pairedDevices = bAdapter.getBondedDevices();
if (pairedDevices.size() > 0 ) // Есть сопряженные устройства. Получите имя и адрес каждого сопряженного устройства.
для (устройство BluetoothDevice : pairedDevices) String deviceName = device.getName();
String deviceHardwareAddress = device.getAddress(); // MAC-адрес
>
>

Если вы наблюдаете приведенный выше код, мы получаем имя сопряженного Bluetooth-устройства и MAC-адрес с помощью объекта BluetoothDevice.

Чтобы узнать больше о сопряженных устройствах Bluetooth, ознакомьтесь со списком сопряженных устройств Android Bluetooth с примерами.

Вот как мы можем использовать Bluetooth в приложениях для Android, чтобы позволить устройствам подключаться по беспроводной сети для обмена данными с другими устройствами Bluetooth.

Вы можете использовать Bluetooth для подключения некоторых устройств к телефону без шнура. После первого сопряжения с устройством Bluetooth ваши устройства могут выполнять сопряжение автоматически. Если ваш телефон подключен к чему-либо через Bluetooth, в верхней части экрана вы увидите значок Bluetooth .

Важно:

  • Некоторые из этих шагов работают только на Android 10 и более поздних версиях. Узнайте, как проверить версию Android.
  • Некоторые из этих шагов требуют касания экрана.

Включить или отключить Bluetooth

  1. Проведите вниз от верхнего края экрана.
  2. Нажмите Bluetooth .

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

Шаг 1. Сопряжение аксессуара Bluetooth

Важно! Ваши устройства остаются сопряженными до тех пор, пока вы не отключите их.

  1. Проведите вниз от верхнего края экрана.
  2. Нажмите и удерживайте Bluetooth .
  3. Нажмите «Подключить новое устройство».
    • Если вы не нашли Подключить новое устройство, проверьте в разделе "Доступные устройства" или нажмите "Еще" Обновить.
  4. Нажмите на название Bluetooth-устройства, которое вы хотите связать с вашим устройством.
  5. Следуйте инструкциям на экране.

Совет. Если вы не получили уведомление, откройте приложение "Настройки" на телефоне и нажмите "Подключенные устройства". В разделе «Устройства поблизости» выберите устройство, которое хотите подключить. Чтобы узнать больше, перейдите в раздел «Найти аксессуары Fast Pair».

Шаг 2. Подключение

  1. Проведите вниз от верхнего края экрана.
  2. Убедитесь, что Bluetooth включен.
  3. Нажмите и удерживайте Bluetooth .
  4. В списке сопряженных устройств нажмите на сопряженное, но не подключенное устройство.
  5. Когда ваш телефон и устройство Bluetooth подключены, устройство отображается как "Подключено".

Настроить, отключить или найти аксессуар Bluetooth

  1. Проведите вниз от верхнего края экрана.
  2. Нажмите и удерживайте Bluetooth .
    • Если ваш аксессуар указан в разделе "Доступные мультимедийные устройства", рядом с названием вашего устройства нажмите "Настройки" .
    • Если в разделе «Ранее подключенные устройства» нет аксессуаров, нажмите «Просмотреть все». Рядом с названием аксессуара нажмите "Настройки" .
  3. Внесите изменения:
    • Чтобы изменить название аксессуара, вверху нажмите "Изменить" .
    • Чтобы отключиться, нажмите "Отключить" .
    • Чтобы полностью удалить устройство из телефона, нажмите "Забыть" .
    • На некоторых устройствах можно включить или отключить другие настройки.
  1. Проведите вниз от верхнего края экрана.
  2. Убедитесь, что Bluetooth включен.
  3. Нажмите и удерживайте Bluetooth .
  4. Нажмите «Имя устройства».
    • Если вы не нашли имя устройства, нажмите "Ещё" Переименовать это устройство.
  5. Введите новое имя.
  6. Нажмите «Переименовать».

Важно! При подключении с помощью Fast Pair ваши аксессуары Bluetooth связываются с вашей учетной записью Google. Другие ваши подключенные устройства могут распознавать недавно добавленные аксессуары и автоматически предлагать вам выполнить сопряжение с аксессуарами.

Чтобы загрузить код, войдите в систему с помощью одной из следующих социальных сетей.

Наберитесь терпения. мы получаем ваш исходный код.

Цель

Вы получите окончательный вывод:

Введение:

Bluetooth. Платформа Android поддерживает соединение Bluetooth, что позволяет обмениваться данными с другими устройствами Bluetooth. Платформа приложения обеспечивает доступ к функциям Bluetooth через Android Bluetooth API, которые подключаются к другим устройствам Bluetooth.

Все API Bluetooth доступны в пакете Android Bluetooth.

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

BluetoothAdapter Представляет локальный адаптер Bluetooth ( Радио Bluetooth).
BluetoothDevice Представляет удаленное устройство Bluetooth, запрашивая такую ​​информацию, как его имя, адрес, класс и состояние связи.
BluetoothSocket Представляет интерфейс для сокета Bluetooth (аналогично сокету TCP).
BluetoothServerSocket< /td> Представляет открытый сокет сервера, который прослушивает входящие запросы (аналогично TCP ServerSocket).
BluetoothClass Описывает общие характеристики и возможности устройства Bluetooth.

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

Шаг 1. Проверка подключения Bluetooth

Сначала нам нужно проверить соединение Bluetooth. Итак, создайте новый класс с именем Connections.

Шаг 2. Файл MainActivity.java

Теперь, когда мы получили ответ от класса Connections в нашем основном действии с BT в состоянии Off, мы получаем диалоговое окно On BT.

Затем мы создаем новый метод в основном классе активности для настройки всей информации Bluetooth в текстовом представлении.

Для получения дополнительной информации перейдите по следующим ссылкам:

Надеюсь, вам понравится этот урок и он будет полезен для вас.

Есть представление о разработке приложений для Android? Чего ты все еще ждешь? Свяжитесь с нами сейчас и скоро увидите идею вживую. Наша компания была названа одной из лучших компаний по разработке приложений для Android в Индии.

Теджас Джасани

Предприниматель, который за 7 лет основал две процветающие компании по разработке программного обеспечения, Теджас стремится понимать все, что связано с играми – от динамики бизнеса до потрясающего дизайна и психологии геймеров. Как основатель и генеральный директор компании, выпустившей несколько очень успешных игр, он кое-что знает об играх. Он делится своими знаниями в блогах и на выступлениях, на которые его приглашают.

Читайте также: