Okay, since this was driving me crazy, I did some digging into the source code and I've found a 100% reliable (at least on my Nexus 4, Android 4.3) solution to connect to a paired A2DP device (such as a headset or Bluetooth audio device). I've published a fully working sample project (easily built with Android Studio) that you can find here on Github.
Essentially, what you need to do is:
- Get an instance of the
BluetoothAdapter
- Using this instance, get a profile proxy for A2DP:
adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);
where listener
is a ServiceListener
that will receive a BluetoothProfile
in its onServiceConnected()
callback (which can be cast to a BluetoothA2dp
instance)
- Use reflection to acquire the
connect(BluetoothDevice)
method on the proxy:
Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
- Find your
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;
}
}
}
- And invoke the
connect()
method:
connect.invoke(proxy, result);
Which, at least for me, caused an immediate connection of the device.