2017-06-03 19 views
0

これは、GoogleのサンプルコードBluetoothChatの標準のコードです。 BluetoothChatService.javaBluetoothデバイスに接続できません

できるだけ早く私は、私は任意の助けをいただければ幸い例外

java.io.IOException: bt socket closed, read return: -1 
at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:872) 
at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96) 
at java.io.InputStream.read(InputStream.java:163) 

を次取得

mChatService.connect(device, false); 

を使用してデバイスを接続しようとして

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     byte[] buffer = new byte[1024]; 
     int bytes; 

     // Keep listening to the InputStream while connected 
     while (mState == STATE_CONNECTED) { 
      try { 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 
       // Send the obtained bytes to the UI Activity 
       mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer) 
         .sendToTarget(); 
      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       break; 
      } 
     } 
    } 

+0

ログによると、bt接続の試行に失敗しました。あなたのデバイスを接続するためにシステムのBluetoothを試すことができます。デバイスをペアにする必要がありますか? –

+0

デバイスは既にペアになっています。 – Nikki

答えて

0

あなたのアプリのアンドロイドマニフェストBluetoothの許可に含まれていましたか?

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
+0

はい。私はすでにマニフェストに上記の権限を含んでいます。 – Nikki

0

私はこの問題は反映による方法createRfcommSocketを取得してくださいmmSocket.connect()

だと思います。

GoogleサンプルコードのBluetoothChatのサンプルベースです。

  // Make a connection to the BluetoothSocket 
      try { 
       Thread.sleep(500); 
       // This is a blocking call and will only return on a 
       // successful connection or an exception 
       mmSocket.connect(); 
       OutputStream os = mmSocket.getOutputStream(); 
       // Here: connect success 
      } catch (Exception e) { 
       Log.i(TAG, "Lost 1st try; SPP connect[2]"); 
       try { 
        mmSocket.close();// close the current socket 
        mmSocket = null; 
        Thread.sleep(500L); // wait for a while 
        mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, 1); // The key method ! 
        mmSocket.connect(); 
        OutputStream os = mmSocket.getOutputStream(); 
        // Here: connect success 
        synchronized (ESDevice.this) { 
         mSPPConnectThread = null; 
        } 
        connected(mmSocket, mmDevice); // begin connected thread 
       } catch (Exception e2) { 
        Log.e(TAG, "Lost 2nd try. Connect fail", e2); 
        connectionFailed(); 
        return; 
       } 
       return; 
      } 
0

あなたはmConnectedThreadのコンストラクタでそれを渡された前に、ソケットが閉じたように見えます。

は、ソケットが実際に接続されたmConnectThreadで我々はmConnectThreadのヌルを行い、Googleのサンプル中の1つのトリッキーなものがありますされ、次のコードが実行されません。

if (mConnectThread != null) { 
    mConnectThread.cancel(); 
    mConnectThread = null; 
} 

ことを意味しているソケットを閉じcancel()方法スキップされます。

基本的には、ソケットが接続された後にConnectThreadclose()メソッドを呼び出さないようにしてください。

関連する問題