android bluetooth can't connect
Solution 1
The jelly bean bluetooth stack is markedly different from the other versions.
This might help: http://wiresareobsolete.com/wordpress/2010/11/android-bluetooth-rfcomm/
In gist: The UUID is a value that must point to a published service on your embedded device, it is not just randomly generated. The RFCOMM SPP connection you want to access has a specific UUID that it publishes to identify that service, and when you create a socket it must match the same UUID.
If you are targeting 4.0.3 device and above , use fetchUuidsWithSdp()
and getUuids()
to find all the published services and their associated UUID values. For backward compatibility read the article
Solution 2
I got the same error message after connecting the socket a second time. I simply checked if the socket is already connected.
if(!mmSocket.isConnected())
mmSocket.connect();
I was testing on Android 4.4.2 (Moto G).
Related videos on Youtube

Kent Andersen
Avid Android developer. I spend all day at work writing Android apps, then often go home to work on my own.
Updated on July 09, 2022Comments
-
Kent Andersen 11 months
I've been having this problem for a while and haven't been able to figure it out.
I have a android application that puts all paired devices in a listview. When you click one of the list items, it will initiate a request to connect to that bluetooth device.
I can get the list of devices with their addresses no problem. The problem is that once I try to connect I get an IOException on socket.connect();
The error message is as follows: "connect read failed, socket might closed or timeout, read ret: -1"
Here is my code. ANY suggestions would be appreciated. I'm pretty stuck on this.
fyi: the "onEvent" methods is a library that simplifies callbacks...that part works. When the user clicks on a list items this method is called "public void onEvent(EventMessage.DeviceSelected event)"
public class EcoDashActivity extends BaseActivity { public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private BluetoothAdapter mBluetoothAdapter; private int REQUEST_ENABLE_BT = 100; private ArrayList<BluetoothDevice> mDevicesList; private BluetoothDeviceDialog mDialog; private ProgressDialog progressBar; private int progressBarStatus = 0; private Handler progressBarHandler = new Handler(); @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); mDevicesList = new ArrayList<BluetoothDevice>(); // Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); setupBluetooth(); } private void setupBluetooth() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth Toast.makeText(this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show(); } if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } else { searchForPairedDevices(); mDialog = new BluetoothDeviceDialog(this, mDevicesList); mDialog.show(getFragmentManager(), ""); } } private void searchForPairedDevices() { Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // If there are paired devices if (pairedDevices.size() > 0) { // Loop through paired devices for (BluetoothDevice device : pairedDevices) { // Add the name and address to an array adapter to show in a ListView mDevices.add(device.getName() + "\n" + device.getAddress()); mDevicesList.add(device); } } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // Add the name and address to an array adapter to show in a ListView mDevicesList.add(device); } } }; @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_ENABLE_BT) { if (resultCode == RESULT_OK) { Toast.makeText(this, "BT turned on!", Toast.LENGTH_SHORT).show(); searchForPairedDevices(); mDialog = new BluetoothDeviceDialog(this, mDevicesList); mDialog.show(getFragmentManager(), ""); } } super.onActivityResult(requestCode, resultCode, data); } public void onEvent(EventMessage.DeviceSelected event) { mDialog.dismiss(); BluetoothDevice device = event.getDevice(); ConnectThread connectThread = new ConnectThread(device); connectThread.start(); } public class ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) { // Use a temporary object that is later assigned to mmSocket, // because mmSocket is final BluetoothSocket tmp = null; mmDevice = device; // Get a BluetoothSocket to connect with the given BluetoothDevice try { // MY_UUID is the app's UUID string, also used by the server code tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } mmSocket = tmp; } public void run() { setName("ConnectThread"); // Cancel discovery because it will slow down the connection mBluetoothAdapter.cancelDiscovery(); try { // Connect the device through the socket. This will block // until it succeeds or throws an exception Log.d("kent", "trying to connect to device"); mmSocket.connect(); Log.d("kent", "Connected!"); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { Log.d("kent", "failed to connect"); mmSocket.close(); } catch (IOException closeException) { } return; } Log.d("kent", "Connected!"); } /** Will cancel an in-progress connection, and close the socket */ public void cancel() { try { mmSocket.close(); } catch (IOException e) { } } }
Here is my logcat. Pretty short.
07-22 10:37:05.129: DEBUG/kent(17512): trying to connect to device 07-22 10:37:05.129: WARN/BluetoothAdapter(17512): getBluetoothService() called with no BluetoothManagerCallback 07-22 10:37:05.129: DEBUG/BluetoothSocket(17512): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[98]} 07-22 10:37:40.757: DEBUG/dalvikvm(17512): GC_CONCURRENT freed 6157K, 9% free 62793K/68972K, paused 7ms+7ms, total 72ms 07-22 10:38:06.975: DEBUG/kent(17512): failed to connect 07-22 10:38:06.975: DEBUG/kent(17512): read failed, socket might closed or timeout, read ret: -1
That last line is in the "Catch" section of a try/catch...I'm just logging the error message.
Please note, there is about a 20 second gap between "trying to connect to device" and "failed to connect"
-
Kent Andersen almost 10 yearsGetUUIDs() returns a list of ids. How do you know which one should be used?
-
Kent Andersen almost 10 yearsI just tried every UUID that it returned and had the same problem.
-
Kent Andersen almost 10 yearsDo you know of a complete code example that i can copy/paste into a new app to just test it out?
-
Vrashabh Irde almost 10 yearsI see two bugs reported related to your issue on Android, see if there is any help or workaround here: code.google.com/p/android/issues/detail?id=41415 and code.google.com/p/android/issues/detail?id=41110
-
Kent Andersen almost 10 yearsI just tried this on the "Note 2" device, and the code worked great. Bluetooth connected right away. Guess its just a bug with Android 4.2.2 or maybe the nexus 4. I've awarded you the bounty points :) Thanks.
-
Kent Andersen over 9 yearsI feel its worth noting to anyone reading this that my code is connecting to a Bluetooth adapter connected to my car. I'm using it for OBD2 readings. I could not get the app to connect with one adapter, but then I recently purchased another and the code worked perfectly. So, either the problem lies with the adapter, or Android has a bug that doesn't allow to communicate with certain devices.