- 1. Введение в BluetoothDevice
- 2. Введение
- 3. Нужно разрешение
- Два API подробно
- 1. Введение в константы
- (1) постоянная широковещательная связь, связанная с ACL-соединением
- (2) Другие широковещательные константы удаленных устройств
- (3) Постоянная состояния связывания
- (4) Дополнительная константа поля
- 2. Введение в публичные методы
- (1) Метод посылки
- (2) Описание
- (2) Установите соединение BluetoothSocket
- (3) метод сравнения
- (4) Получить адрес Bluetooth
- (5) Получить Bluetooth
- (6) Получить статус привязки устройства
- (7) Получить Bluetooth-имя устройства
- (8) Получить хэш-значение
- (9) Строковый метод
- Как программно выполнить сопряжение устройства Bluetooth на Android
- 10 ответов
1. Введение в BluetoothDevice
Этот класс реализует интерфейс Parcelable. Объекты класса, реализующего интерфейс Parcelable, могут быть инкапсулированы в объекты Parcel, а инкапсулированные данные могут быть переданы через Intent или IPC;
Ключевые моменты реализации интерфейса Parcelable :
Реализация метода writeTpParcl (): запись данных в объект Parcel;
public void writeToParcel(Parcel out, int arg1) < // TODO Auto-generated method stub out.writeBundle(this.mBundle); >
б) реализовать метод descriptionContents ():
public int describeContents() < // TODO Auto-generated method stub return 0; >
Внедрите интерфейс Parcelable.Creator:
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() < public TrainInfo createFromParcel(Parcel in) < SampleBean ti=new SampleBean(); ti.mBundle=in.readBundle(); return ti; >public SampleBean[] newArray(int size) < return new SampleBean[size]; >>;
2. Введение
Объект BluetoothDevice представляет удаленное устройство Bluetooth.С помощью этого класса вы можете запрашивать физический адрес, имя, состояние соединения и другую информацию удаленного устройства;
Операции этого типа будут выполняться на оборудовании удаленного устройства Bluetooth.
Способ приобретения объекта:
А. Вызвать метод getRemoteDevice (address) BluetoothAdapter, чтобы получить соответствующий объект физического адреса;
Б. Вызвать метод getBoundedDevices () BluetoothAdapter, чтобы получить набор сопряженных Bluetooth-устройств;
3. Нужно разрешение
android.permission.BLUETOOTH : Разрешить программе подключаться к сопряженному устройству Bluetooth, запрашивать разрешение на подключение / получение подключения / передавать данные, необходимо изменить разрешения, в основном используемые для работы после сопряжения;
android.permission.BLUETOOTH_ADMIN : Позволяет программе обнаруживать и связывать устройства Bluetooth. Это разрешение используется для управления устройствами Bluetooth. С этим разрешением приложения могут использовать устройства Bluetooth устройства, главным образом для операций перед сопряжением;
Приоритет: разрешение BLUETOOTH является предпосылкой разрешения BLUETOOTH_ADMIN. Если у вас нет разрешения BLUETOOTH, вы не можете использовать разрешение BLUETOOTH_ADMIN;
Два API подробно
1. Введение в константы
Правила вещания : Вы можете угадать тип трансляции на основе имени трансляции. Если за константой имени трансляции следует ED, что в прошлом, то эту трансляцию необходимо зарегистрировать Полученная трансляция Например, ACTION_DISCOVERY_STARTED, это трансляция, которую устройство Bluetooth начинает искать;
Если имя константы вещания не заканчивается на ED, то это нормально Трансляция отправлена Например, Bluetooth открывает трансляцию: ACTION_REQUEST_ENABLE (Bluetooth доступен), ACTION_REQUEST_DISCOVERABLE (Bluetooth видимый);
Низкоуровневые и высокоуровневые соединения : ACL-соединения — это низкоуровневые соединения, RFCOMM, L2CAP и другие соединения — высокоуровневые соединения, высокоуровневые соединения основаны на низкоуровневых соединениях;
(1) постоянная широковещательная связь, связанная с ACL-соединением
ACL соединение : Соединение является низкоуровневым, ACL-соединение автоматически управляется стеком Android Bluetooth;
String ACTION_ACL_CONNECTED : android.bluetooth.device.action.ACL_CONNECTED, Трансляция с ACL-соединением, установленным с удаленным устройством , Содержит дополнительный домен EXTRA_DEVICE, Этот дополнительный домен хранит объект BluetoothDevice и требует разрешения BLUETOOTH;
String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED, Трансляция после отключения ACL от удаленного устройства , Содержит дополнительный домен EXTRA_DEVICE, требует разрешения BLUETOOTH;
String ACTION_ACL_DISCONNECT_REQUESTED : android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, нижний уровень выдает запрос на отключение, Соединение ACL собирается быть разъединенным ; Эта широковещательная рассылка будет отправлена, когда разорвано дружественное соединение. Когда должно разорваться соединение низкого уровня, соединение высокого уровня должно быть немедленно прервано; требуется разрешение BLUETOOTH;
(2) Другие широковещательные константы удаленных устройств
String ACTION_BOND_STATE_CHANGED : android.bluetooth.device.action.BOND_STATE_CHANGED, Эта трансляция отправляется при изменении состояния удаленного устройства Bluetooth Например, устройство соответствует, или не сопряжено; дополнительные поля, включенные в трансляцию: EXTRA_DEVICE, EXTRA_BOND_STATE, EXTRA_BOND_PREVIOUS_STATE; требуется разрешение BLUETOOTH;
String ACTION_CLASS_CHANGED : android.bluetooth.device.action.CLASS_CHANGED, один Трансляция при изменении статуса привязки удаленного устройства , Дополнительный домен широковещания имеет EXTRA_DEVICE, EXTRA_BOND_STATE; требуется разрешение BLUETOOTH;
String ACTION_FOUND : android.bluetooth.device.action.FOUND, Трансляция отправляется при обнаружении удаленного устройства ; Эта трансляция всегда содержит EXTRA_DEVICE, дополнительные поля EXTRA_CLASS, Если этот Bluetooth доступен, он также будет содержать дополнительные поля EXTRA_NAME, EXTRA_RSSI; требуется разрешение BLUETOOTH;
String ACTION_NAME_CHANGED : android.bluetooth.device.action.NAME_CHANGED, Обнаружено, что имя удаленного устройства Bluetooth изменено или широковещательная рассылка отправляется при первом обнаружении имени удаленного устройства Bluetooth , Трансляция содержит дополнительные домены EXTRA_DEVICE, дополнительные домены EXTRA_NAME; требуется разрешение BLUETOOTH;
(3) Постоянная состояния связывания
Связанный : int BOND_BONDED , Значение равно 12, удаленное устройство сопоставлено, общее подключение удаленного устройства хранится локально, и связь между локальным устройством и удаленным устройством может быть аутентифицирована и зашифрована, это соединение еще не успешно установлено, всегда сохраняйте статус соединения, это соединение В результате не требуется снова устанавливать новое соединение Bluetooth при следующем подключении;
переплет : int BOND_BONDING , Значение равно 11; локальное устройство и удаленное устройство совпадают;
Не соответствует : int BOND_NONE , Значение равно 10: локальное устройство не подключено к удаленному устройству, нет локального соединения с удаленным устройством, и связь между устройствами не может быть аутентифицирована и зашифрована;
(4) Дополнительная константа поля
Обязательное состояние : String EXTRA_BOND_STATE , int дополнительное поле, значение равно android.bluetooth.device.extra.BOND_STATE, это дополнительное поле является дополнительным полем ACTION_BOND_STATE_CHANGED, возможные значения BOND_BONDED, BOND_BONDING, BOND_NONE;
Последнее связующее состояние : String ACTION_PREVIOUS_BOND_STATE , int дополнительный домен, в котором хранится состояние привязки удаленного устройства, значение равно «android.bluetooth.device.extra.PREVIOUS_BOND_STATE», Этот дополнительный домен является дополнительным доменом, транслируемым ACTION_BOND_STATE_CHANGED;
BluetoothClass : String EXTRA_CLASS , Parcelable дополнительный домен BluetoothClass, хранить объект BluetoothClass; значение равно android.bluetooth.device.extra.CLASS, Этот дополнительный домен ACTION_FOUND, ACTION_CLASS_CHANGED транслировать дополнительный домен;
BluetoothDevice : String EXTRA_DEVICE , Parcelable дополнительный домен BluetoothDevice, хранить объект BluetoothDevice, значение равно «android.bluetooth.device.extra.DEVICE», Почти у каждого вещания в этом классе есть этот дополнительный домен;
Имя Bluetooth : String EXTRA_NAME , Bluetooth имя дополнительного домена, сохранить имя Bluetooth, значение «android.bluetooth.device.extra.NAME», этот дополнительный домен ACTION_NAME_CHANGED, ACTION_FOUND транслировать дополнительный домен;
Сила сигнала : String EXTRA_RSSI Короткое целое дополнительное поле, в котором хранится значение уровня сигнала удаленного устройства; значение равно «android.bluetooth.device.extra.NAME»;
2. Введение в публичные методы
(1) Метод посылки
public void writeToParcel (Parcel out, int flags)
Параметры: out, целевой объект для инкапсуляции, флаги, дополнительные флаги о том, как записывается объект;
(2) Описание
public int describeContents ()
Функция: реализовать интерфейс Parcelable;
(2) Установите соединение BluetoothSocket
public BluetoothSocket createRfcommSocketToServiceRecord (UUID uuid)
Роль: создание объекта подключения BluetoothSocket, этот метод создает объект подключения BluetoothSocket и BluetoothAdapter Соединение BluetoothServerSocket, созданное методом listenUsingRfcommWithServiceRecord, соответствует вызывает метод connect () объекта BluetoothSocket для создания соединения и выполняет действие поиска SDP соответствующего канала через UUID;
Если вам нужно сгенерировать выделенный UUID для соединения между двумя телефонами Android, если вы подключаетесь к последовательному порту Bluetooth, используйте хорошо известный SPP UUID 00001101-0000-1000-8000-00805F9B34FB
Параметры: UUID, используемый для идентификации удаленного устройства Bluetooth, UUID используется для запроса служебной записи канала RFCOMM;
Возвращаемое значение: созданный объект подключения BluetoothSocket
(3) метод сравнения
public boolean equals (Object o)
Функция: сравните объект, вызывающий этот метод, с объектом o, если они равны, верните true, в противном случае верните false;
Параметры: объекты для сравнения
Возвращаемое значение: если два объекта равны, вернуть true, иначе вернуть false;
(4) Получить адрес Bluetooth
Функция: возвращает адрес Bluetooth устройства, этот адрес Bluetooth состоит из 17 цифр, и все буквы являются заглавными;
(5) Получить Bluetooth
public BluetoothClass getBluetoothClass ()
Функция: для получения класса Bluetooth удаленного устройства требуется разрешение BLUETOOTH. В случае возникновения ошибки верните ноль;
(6) Получить статус привязки устройства
Функция: Получить статус удаленного устройства, которое может быть одним из BOND_BONDED, BOND_BONDING, BOND_NONE;
(7) Получить Bluetooth-имя устройства
Функция: Получить имя удаленного устройства Bluetooth
(8) Получить хэш-значение
Функция: Получить значение хеша, вы можете переопределить этот метод
(9) Строковый метод
Как программно выполнить сопряжение устройства Bluetooth на Android
Для моего приложения я пытаюсь программно подключить Bluetooth-устройство. Я могу показать диалог сопряжения для устройства, которое я хочу установить, и я могу ввести pincode. Когда я нажимаю «Пара», диалог удаляется и ничего не происходит. Мне нужно только поддерживать устройства с Android 2.0 и новее. В настоящее время я использую следующий код для запуска процесса спаривания:
public void pairDevice(BluetoothDevice device)
Я провел несколько дней в поисках решения этой проблемы. Похоже, что Google считает принудительное сопряжение проблемой безопасности, поэтому перечисленные здесь типы ДЕЙСТВИЙ на самом деле не существуют. я нашел класс, на который вы ссылаетесь здесь: developer.oesf.biz/em/developer/reference/cinnamon/android/… но его нет в официальных документах: developer.android.com/reference/android/bluetooth/…
Используя рефлексию, вы можете вызвать метод createBond из класса BluetoothDevice. Решение: см. Этот пост: Как программно отключить или удалить сопряженное устройство Bluetooth на Android ( stackoverflow.com/questions/9608140/… )? Существует также решение для несправедливости.
10 ответов
Мне удалось автоматически запросить процедуру сопряжения с клавиатурными устройствами через приложение, работающее как служба, проверяющее наличие определенного типа устройства и измененную версию приложения «Настройки».
Я должен сказать, что я работал над настраиваемым устройством под управлением Android 4.0.3 без внешних элементов управления (нет кнопок возврата/дома/подтверждения): соединение контроллера с загрузкой завершено без какого-либо взаимодействия до тех пор, пока запрос PIN не станет обязательным.
Сначала я создал службу, запускающую активность при загрузке (с android.intent.action.BOOT_COMPLETED и android.permission.RECEIVE_BOOT_COMPLETED) , которая периодически проверяет наличие устройства класса 1344 (клавиатура, единственный способ ввода данных по запросу) в обратном вызове onReceive:
public void onReceive(Context context, Intent intent) . BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); . if(dev.getBluetoothClass().getDeviceClass() == 1344)
После фильтрации я выбираю первую доступную клавиатуру, а затем передаю адрес BT в приложение «Настройки»:
Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS); btSettingsIntent.putExtra("btcontroller", dev.getAddress()); startActivityForResult(btSettingsIntent, 1);
Сложная часть искала лучшую позицию для вызова процесса сопряжения. Используя только
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
привел меня к диалоговому окну, который когда-то был закрыт, оставил меня с устройством в паре, но непригодным для использования.
Копаем в классы com.ndroid.settings.Bluetooth Я нашел свой путь через
createDevicePreference(CachedBluetoothDevice cachedDevice)
в элементе DeviceListPreferenceFragment.
Оттуда я сравнил свой ранее выбранный адрес BT с теми, которые доступны, и один раз успешно совпадающий. Я вызываю
Я знаю, это сложно и требует доступа к исходному коду Android, но в пользовательской среде он работает.
Я надеюсь, что это может быть полезно.