title: android bluetooth can't connect
body: <p>I've been having this problem for a while and haven't been able to figure it out. </p>
  
  <p>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.  </p>
  
  <p>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();</p>
  
  <p>The error message is as follows:
  <strong>"connect read failed, socket might closed or timeout, read ret: -1"</strong></p>
  
  <p>Here is my code. <strong>ANY</strong> suggestions would be appreciated. I'm pretty stuck on this.</p>
  
  <p>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 "<strong>public void onEvent(EventMessage.DeviceSelected event)</strong>"</p>
  
  <pre><code>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&lt;BluetoothDevice&gt; 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&lt;BluetoothDevice&gt;();
  
      // 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&lt;BluetoothDevice&gt; pairedDevices = mBluetoothAdapter.getBondedDevices();
      // If there are paired devices
      if (pairedDevices.size() &gt; 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) { }
      }
  }
  </code></pre>
  
  <p>Here is my logcat. Pretty short.</p>
  
  <pre><code>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
  </code></pre>
  
  <p>That last line is in the "Catch" section of a try/catch...I'm just logging the error message.</p>
  
  <p>Please note, there is about a 20 second gap between "trying to connect to device" and "failed to connect"</p>