title: Android Bluetooth connection issue
body: <p>I try to set up a Bluetooth connection as follows:</p>
  
  <pre><code>private class ConnectThread extends Thread {
  
      private final BluetoothSocket mmSocket;
      private final BluetoothDevice mmDevice;
      BluetoothSocket connection = null;
  
      public ConnectThread(BluetoothDevice device) {
          mmDevice = device;
          // Get a BluetoothSocket for a connection with the
          // given BluetoothDevice
          try {
              if(D)
                  Log.i(TAG, "createRfcommSocket");
              Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
              connection = (BluetoothSocket) m.invoke(mmDevice, 1);
  
              Utils.pause(100);
          } catch (Exception e) {
              Log.e(TAG, "create() failed", e);
          }
          if(D) 
              Log.i(TAG, "Bluetooth socket initialised");
          mmSocket = connection;
      }
  
      public void run() {
          if(D) 
              Log.i(TAG, "BEGIN mConnectThread on Device: " + mmDevice);
          setName("ConnectThread");
  
          if (mmSocket != null) {
              // Always cancel discovery because it will slow down a connection
              if(mAdapter.isDiscovering()) {
                  if(D) 
                      Log.i(TAG, "stop discovering before trying to connect");
                  mAdapter.cancelDiscovery();
              }
  
              // Make a connection to the BluetoothSocket
              try {
                  // This is a blocking call and will only return on a
                  // successful connection or an exception
                  if(D) 
                      Log.i(TAG, "start Bluetooth socket connection");
                  mmSocket.connect();
                  if(D) 
                      Log.i(TAG, "end of Bluetooth socket connection");
              } catch (Exception e1) {
                  Log.e(TAG, "connect failed", e1);
                  connectionFailed();
  
                  // Reset the socket
                  resetConnection(mmSocket);
  
                  // Start the service over to restart listening mode
                  if(D) 
                      Log.i(TAG, "restart connection");
                  BluetoothConnectionService.this.start();
                  if(D) 
                      Log.i(TAG, "return");
                  return;
              }
  
              // Start the connected thread
              if(D) 
                  Log.i(TAG, "The device is considered as connected, call connected thread");
              connected(mmSocket, mmDevice);
          } else {
              if(D) 
                  Log.i(TAG, "connection fail");
              connectionFailed();
              BluetoothConnectionService.this.start();
          }
      }
  
      public void cancel() {
          if(D) 
              Log.i(TAG, "connect thread cancel");
          resetConnection(mmSocket);
      }
  }
  </code></pre>
  
  <p>The connection seems to be OK, and I get this log:</p>
  
  <pre><code>DEBUG/BluetoothConnectionService(3439): **connect to: 00:18:E4:21:8B:5E**
  INFO/BluetoothConnectionService(3439): createRfcommSocket
  INFO/BluetoothConnectionService(3439): Bluetooth socket initialised
  INFO/BluetoothConnectionService(3439): BEGIN mConnectThread on Device : 00:18:E4:21:8B:5E
  INFO/BluetoothConnectionService(3439): **start Bluetooth socket connection**
  INFO/BluetoothConnectionService(3439): setState() 1 -&gt; 2
  INFO/ProtectionService(3439): MESSAGE_STATE_CHANGE: 1
  DEBUG/ProtectionService(3439): STATE_CHANGED to STATE_LISTEN
  INFO/ProtectionService(3439): MESSAGE_STATE_CHANGE: 2
  DEBUG/abtfilt(2772): **Conn complete**
  INFO/bluetoothd(2776): link_key_request (sba=24:21:AB:F4:69:25, dba=00:18:E4:21:8B:5E)
  INFO/bluetoothd(2776): link_key_request (sba=24:21:AB:F4:69:25, dba=00:18:E4:21:8B:5E)
  INFO/BluetoothConnectionService(3439): **end of Bluetooth socket connection**
  INFO/BluetoothConnectionService(3439): **The device is considered as connected, call connected thread**
  </code></pre>
  
  <p>The <code>BluetoothSocket.connect()</code> returns without error.</p>
  
  <p>Then I manage the connection with this:</p>
  
  <pre><code>private class ConnectedThread extends Thread {
  
      private final BluetoothSocket mmSocket;
      private final InputStream mmInStream;
      private final OutputStream mmOutStream;
  
      public ConnectedThread(BluetoothSocket socket) {
          if(D) Log.d(TAG, "create ConnectedThread");
          mmSocket = socket;
  
          // Get the BluetoothSocket input and output streams
          try {
              if(D) 
                  Log.i(TAG, "Get input stream");
              tmpIn = socket.getInputStream();
              if(D) 
                  Log.i(TAG, "Get output stream");
              tmpOut = socket.getOutputStream();
              if(D) 
                  Log.i(TAG, "isConnected = true");
              isConnected = true;
          } catch (IOException e) {
              Log.e(TAG, "Input and Output sockets not created", e);
              isConnected = false;
          }
  
          mmInStream = tmpIn;
          mmOutStream = tmpOut;
      }
  
      public void run() {
          if(D) 
              Log.i(TAG, "BEGIN mConnectedThread");
          byte[] buffer = new byte[1024]; //buffer store for the stream
          int bytes; //bytes returned from read()
  
          // Keep listening to the InputStream until an exception occurs
          while(true) {
              try {
                  // Read from the InputStream
                  if(D) 
                      Log.i(TAG, "start read mmInStream");
                  bytes = mmInStream.read(buffer);
                  if(D) 
                      Log.i(TAG, "Bytes read: " + bytes);
  
                  // Send the obtained bytes to the UI Activity
                  mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
              } catch (IOException e) {
                  Log.e(TAG, "ConnectedThread: disconnected", e);
                  break;
              }
          }
      }
  
      /**
       * Write to the connected OutStream.
       *
       * @param buffer
       *            The bytes to write
       */
      public void write(byte[] buffer) {
          try {
              mmOutStream.write(buffer);
  
              // Share the sent message back to the UI Activity
              mHandler.obtainMessage(MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
              // mmOutStream.flush();
          } catch (IOException e) {
              Log.e(TAG, "Exception during write", e);
              connectionFailed();
          }
      }
  
      public void cancel() {
          if(D) 
              Log.i(TAG, "connected Thread cancel");
          resetConnection(mmSocket);
      }
  
  }
  </code></pre>
  
  <p>And I receive this error:</p>
  
  <pre><code>DEBUG/BluetoothConnectionService(3439): create ConnectedThread
  INFO/BluetoothConnectionService(3439): Get input stream
  INFO/BluetoothConnectionService(3439): Get output stream
  INFO/BluetoothConnectionService(3439): isConnected = true
  INFO/BluetoothConnectionService(3439): BEGIN mConnectedThread
  INFO/BluetoothConnectionService(3439): start read mmInStream
  INFO/BluetoothConnectionService(3439): setState() 2 -&gt; 3
  INFO/ProtectionService(3439): MESSAGE_STATE_CHANGE: 3
  DEBUG/ProtectionService(3439): connectionEstablished
  **ERROR/BluetoothConnectionService(3439): ConnectedThread : disconnected
  ERROR/BluetoothConnectionService(3439): java.io.IOException: Software caused connection abort
  ERROR/BluetoothConnectionService(3439):     at android.bluetooth.BluetoothSocket.readNative(Native Method)
  ERROR/BluetoothConnectionService(3439):     at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:307)
  ERROR/BluetoothConnectionService(3439):     at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
  ERROR/BluetoothConnectionService(3439):     at java.io.InputStream.read(InputStream.java:133)**
  INFO/ProtectionService(3439): Send Bluetooth message
  **ERROR/BluetoothConnectionService(3439): Exception during write
  ERROR/BluetoothConnectionService(3439): java.io.IOException: Transport endpoint is not connected
  ERROR/BluetoothConnectionService(3439):     at android.bluetooth.BluetoothSocket.writeNative(Native Method)
  ERROR/BluetoothConnectionService(3439):     at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:317)**
  </code></pre>
  
  <p>The error clearly come when I am doing this:</p>
  
  <pre><code>bytes = mmInStream.read(buffer);
  </code></pre>
  
  <p>What am I doing wrong?</p>