android bluetooth can't connect

28,409

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).

Share:
28,409

Related videos on Youtube

Kent Andersen
Author by

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, 2022

Comments

  • Kent Andersen
    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
    Kent Andersen almost 10 years
    GetUUIDs() returns a list of ids. How do you know which one should be used?
  • Kent Andersen
    Kent Andersen almost 10 years
    I just tried every UUID that it returned and had the same problem.
  • Kent Andersen
    Kent Andersen almost 10 years
    Do you know of a complete code example that i can copy/paste into a new app to just test it out?
  • Vrashabh Irde
    Vrashabh Irde almost 10 years
    I 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
    Kent Andersen almost 10 years
    I 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
    Kent Andersen over 9 years
    I 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.

Related