Программно подключиться к сопряженному устройству Bluetooth
Есть ли способ с помощью Android SDK программно подключиться к уже сопряженному устройству Bluetooth?
Другими словами: я могу зайти в "Настройки" -> "Беспроводные сети" -> "Настройки Bluetooth" и коснуться устройства (в списке "Сопряжено, но не подключено"), после чего оно подключится. Я бы хотел сделать это программно, но не вижу способа сделать это.
Я вижу варианты для создания гнезда RFCOMM, и для устройства SPP, я предполагаю, что это будет также выполнять часть соединения, но для устройства A2DP, где фактическая передача данных будет обрабатываться ОС, а не мое приложение, я думаю, что это не применимо?
4 ответа
Хорошо, так как это сводило меня с ума, я немного покопался в исходном коде и нашел 100% надежное (по крайней мере, на моем Nexus 4, Android 4.3) решение для подключения к сопряженному устройству A2DP (например, к гарнитуре) или аудиоустройство Bluetooth). Я опубликовал полностью рабочий пример проекта (легко создаваемый с помощью Android Studio), который вы можете найти здесь, на Github.
По сути, то, что вам нужно сделать, это:
- Получить экземпляр
BluetoothAdapter
- Используя этот экземпляр, получите профиль прокси для A2DP:
adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);
где listener
это ServiceListener
который получит BluetoothProfile
в его onServiceConnected()
обратный вызов (который может быть приведен к BluetoothA2dp
пример)
- Используйте отражение, чтобы приобрести
connect(BluetoothDevice)
Метод на прокси:
Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
- Найди свой
BluetoothDevice
:
String deviceName = "My_Device_Name";
BluetoothDevice result = null;
Set<BluetoothDevice> devices = adapter.getBondedDevices();
if (devices != null) {
for (BluetoothDevice device : devices) {
if (deviceName.equals(device.getName())) {
result = device;
break;
}
}
}
- И вызвать
connect()
метод:
connect.invoke(proxy, result);
Что, по крайней мере, для меня, вызвало немедленное подключение устройства.
Лучший способ, который я нашел, чтобы решить мою проблему, это выяснить, что я могу создать кнопку, которая вызывает экран настроек Bluetooth. Я не осознавал, что ты мог бы сделать это, иначе я бы сделал это с самого начала.
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
Если устройство уже сопряжено, то вы можете использовать
if(device.getBondState()==device.BOND_BONDED){
Log.d(TAG,device.getName());
//BluetoothSocket mSocket=null;
try {
mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.d(TAG,"socket not created");
e1.printStackTrace();
}
try{
mSocket.connect();
}
catch(IOException e){
try {
mSocket.close();
Log.d(TAG,"Cannot connect");
} catch (IOException e1) {
Log.d(TAG,"Socket not closed");
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
для использования MY_UUID
private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
Приведенный выше фрагмент кода предназначен только для подключения вашего устройства к устройству с поддержкой A2DP. Я надеюсь, что это сработает.
Я использовал здесь код в качестве отправной точки для этой функции в моем приложении: http://developer.android.com/guide/topics/wireless/bluetooth.html
После сопряжения устройства у приложения не возникает проблем с программным соединением двух устройств.