Работа с Bluetooth
Платформа Android предоставляет разработчику богатые коммуникационные возможности. Для работы с Bluetooth в состав Android входит мощный API, позволяющий легко производить сканирование окружающего пространства на предмет наличия готовых к соединению устройств, передачу данных между устройствами и многое другое. Работа с Bluetooth состоит из четырех этапов: установка настроек bluetooth адаптера, поиск доступных для соединения устройств, установка соединения, передача данных.
Обзор Android Bluetooth api
Bluetooth API располагается в пакетеandroid.bluetooth. В его состав входит несколько классов:
BluetoothAdapter- отвечает за работу с установленным в телефоне Bluetooth модулем. Экземпляр этого класса есть в любой программе, использующей bluetooth. В состав этого класса входят методы, позволяющие производить поиск доступных устройств, запрашивать список подключенных устройств, создавать экземпляр класса BluetoothDevice на основании известного MAC адреса и создавать BluetoothServerSocket для ожидания запроса на соединение от других устройств.
BluetoothDevice- класс, ассоциирующийся с удаленным Bluetooth устройством. Экземпляр этого класса используется для соединения через BluetoothSocket или для запроса информации об удаленном устройстве (имя, адресс, класс, состояние).
BluetoothSocket- интерфейс для Bluetooth socket, аналогичный TCP сокетам. Это точка соединения, позволяющая обмениваться данными с удаленным устройством через InputStream и OutputStream.
BluetoothServerSocket- представляет открытый сокет сервера, готовый к обработке входящего запроса. Для того чтобы соединить два Android устройства, одно из них должно открыть сокет с помощью этого класса. Когда удаленное устройство пошлет запрос на соединение, BluetoothServerSocket вернет объект BluetoothSocket.
BluetoothClass- описывает основные параметры Bluetooth модуля. Объект этого класса доступен только в режиме чтения и может быть полезен при определении типа устройства.
BluetoothProfile- интерфейс, представляющий Bluetooth профиль (спецификацию беспроводного интерфейса для соединения устройств через Bluetooth). Примером профиля может служить Hands-Free profile, определяющий порядок работы с беспроводной гарнитурой.
BluetoothHeadset- обеспечивает поддержку bluetooth гарнитур. Включает в себя профили Bluetooth Headset и Hands-Free (v1.5).
BluetoothA2dp- Описывает Advanced Audio Distribution Profile, определяющий передачу потока высококачественных аудиоданных через bluetooth.
BluetoothHealth- определяет proxy для Health Device Profile.
BluetoothHealthCallback- абстрактный класс, который можно использовать для реализации обратных вызовов от BluetoothHealth. Для того чтобы регистрировать изменение состояния Bluetooth устройства нужно на основе этого класса создать собственный и переопределить в нем callback методы.
BluetoothHealthAppConfiguration- конфигурация, которая используется для соединения с различными медицинскими bluetooth устройствами.
BluetoothProfile.ServiceListener- интерфейс, который посылает уведомление BluetoothProfile IPC клиентам при их подключении и отключении от сервиса.
В рамках этой статьи мы не будем углубляться в суть работы с медицинскими bluetooth устройствами и сосредоточимся на первых четырех классах.
Установка настроек Bluetooth адаптера из Android
Если Вы решили задействовать в своей программе возможности Bluetooth модуля, вам необходимо, прежде всего, подключить соответствующий пакет API.
import android.bluetooth.*;
Помимо этого необходимо дать приложению разрешение на использования Bluetooth модуля. Для этого в манифест программы нужно добавить строку
<uses-permission android:name="android.permission.BLUETOOTH" />
Если Вы собираетесь использовать критические с точки зрения безопасности возможности, например, изменить имя устройства, то нужно дать более мощные разрешения BLUETOOTH_ADMIN:
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
При использовании разрешения BLUETOOTH_ADMIN, необходимо также указывать и BLUETOOTH. Прежде чем соединяться с кем-нибудь и передавать данные нужно убедиться, что ваш телефон имеет bluetooth модуль. Первым делом при работе с bluetooth API нужно создать экземпляр класса BluetoothAdapter
BluetoothAdapter bluetooth= BluetoothAdapter.getDefaultAdapter();
Если ваш телефон не поддерживает bluetooth, будет возвращено значение "null". На практике нужно всегда проверять это условие, чтобы избежать ошибок.
BluetoothAdapter bluetooth= BluetoothAdapter.getDefaultAdapter();
if(bluetooth!=null)
{
// С Bluetooth все в порядке.
}
Даже если ваш аппарат оснащен Bluetooth модулем, он может быть недоступен, поскольку пользователь просто отключил его. Для проверки доступности Bluetooth служит метод isEnabled(). В случае, если модуль отключен, можно предложить пользователю включить его.
if (bluetooth.isEnabled()) { // Bluetooth включен. Работаем. } else { // Bluetooth выключен. Предложим пользователю включить его. Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }
Если пользователь согласился на включение адаптера, в переменную enableBtIntent будет записано значение RESULT_OK. В противном случае - RESULT_CANCELED. После того, как все проверки выполнены, можно приступать к работе. Давайте, например, отобразим имя и адрес нашего адаптера, вызвав методы getName() и getAddress().
String status;
if(bluetooth.isEnabled()){
String mydeviceaddress= bluetooth.getAddress();
String mydevicename= bluetooth.getName();
status= mydevicename+" : "+ mydeviceaddress;
}
else
{
status="Bluetooth выключен";
}
Toast.makeText(this, status, Toast.LENGTH_LONG).show();
Если приложение имеет разрешение BLUETOOTH_ADMIN, вы можете изменить имя Bluetooth устройства с помощью метода
bluetooth.setName("AndroidCoder");
для отображения состояния адаптера служит метод BluetoothAdapter.getState(). Этот метод может возвращать одно из следующих значений: STATE_TURNING_ON STATE_ON STATE_TURNING_OFF STATE_OFF Часто в целях экономии заряда батареи Bluetooth выключен по умолчанию. Следующих код создает сообщение, в котором информирует пользователя о состоянии адаптера:
String state= bluetooth.getState();
status= mydevicename+ ”: ”+ mydeviceaddress+" : "+ state;
