Программно подключаться к сопряженному устройству Bluetooth
Есть ли способ, с помощью Android SDK, программно подключиться к уже сопряженному Bluetooth-устройству?
Другими словами: я могу войти в Настройки → Беспроводные сети → Настройки Bluetooth и коснуться устройства (в списке "Сопряжен, но не подключен" ), после чего он будет подключаться. Я хотел бы иметь возможность делать это программно, но не вижу способа сделать это.
Я вижу параметры для создания сокета RFCOMM, а для устройства SPP я предполагаю, что будет делать и часть соединения, но для устройства A2DP, где фактическая передача данных будет обрабатываться ОС а не моим приложением, я думаю, что это не применимо?
Ответы
Ответ 1
Хорошо, так как это сводило меня с ума, я немного поработал в исходном коде, и я нашел 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);
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);
Который, по крайней мере для меня, вызвал немедленное соединение устройства.
Ответ 2
Лучший способ найти мою проблему - выяснить, что я могу создать кнопку, которая отображает экран настроек Bluetooth. Я не понимал, что вы могли бы это сделать, или я бы с самого начала.
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
Ответ 3
если устройство уже сопряжено, вы можете использовать
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 устройству.
Я надеюсь, что это сработает.
Ответ 4
Я использовал код здесь как отправную точку для этой функции в своем приложении: http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices
Как только устройство сопряжено, приложение не имеет проблем с подключением обоих устройств вместе.