Programmatically connect to paired Bluetooth device

AndroidBluetooth

Android Problem Overview


Is there a way, using the Android SDK, to programmatically connect to an already-paired Bluetooth device?

In other words: I can go into Settings -> Wireless & networks -> Bluetooth settings, and tap the device (listed as "Paired but not connected"), at which point it will connect. I'd like to be able to do this programmatically, but don't see a way to do this.

I see the options to create an RFCOMM socket, and for a SPP device, I'm assuming that'll do the connection part as well, but for an A2DP device, where the actual data transfer will be handled by the OS rather than by my app, I think that's not applicable?

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

the best way I found to solve my problem was finding out that I can create a button that brings up the Bluetooth Settings screen. I didn't realize you could do this, or I would have from the beginning.

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));

Solution 3 - Android

if the device is already paired , then you can use

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();
			}
			
		
		}

for the MY_UUID use

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

the above code snippet is just to connect your device to an A2DP supported device. I hope it will work.

Solution 4 - Android

I used the code here as a starting point for this functionality in my app: http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

Once the device is paired, the app has no problem connecting the two devices together programmtically.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrmc47View Question on Stackoverflow
Solution 1 - AndroidKevin CoppockView Answer on Stackoverflow
Solution 2 - AndroidBelbozView Answer on Stackoverflow
Solution 3 - Androidnam_phView Answer on Stackoverflow
Solution 4 - AndroidMarc BernsteinView Answer on Stackoverflow