5

Bluetooth を使用して 2 つの Android デバイス間でテキストを送信するために、Bluetooth チャット アプリの Android サンプルをダウンロードしました。

このアプリを 2 つの Android デバイスにインストールして実行しました。

私はそのコードで多くの問題に直面しました

  1. サービス検出失敗の例外 -修正済み
  2. java.io.IOException: ソフトウェアが原因で接続が中止された -修正済み
  3. java.io.IOException: ピアによって接続がリセットされました -これが発生しました

1. Service discovery failed 例外をクリアしました:

サービス検出に失敗した例外については、Bluetooth チャット サービスで、sdk バージョンを確認しました。sdk バージョンが Ginger Bread よりも大きい場合は、

Method クラスを使用して RfCOMM ソケット接続を呼び出しましたが、最初の例外はこのアプローチで解決されました。

例外コード

 tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

修正された例外コード

try {
if (Build.VERSION.SDK_INT < 9) { 
try {
     tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
       } catch (IOException e1) {
            e1.printStackTrace();
       }
       } else {
   Method m = null;
  try {
  m = device.getClass().getMethod("createRfcommSocket",
        new Class[] { int.class });
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
                }
                try {
                    tmp = (BluetoothSocket) m.invoke(device, 1);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                }
            } catch (Exception e) {
                Log.e(TAG, "create() failed", e);
            }

2. java.io.IOException をクリア: ソフトウェアが原因で接続が中止されました

InputStream が利用可能かどうかを確認しました

例外コード

bytes = mmInStream.read(buffer);

修正された例外コード

 if (mmInStream.available() > 0) {
                            // Read from the InputStream
                            bytes = mmInStream.read(buffer);

今私の問題は、接続されたデバイス間でデータを送信しようとすると、出力ストリームへの書き込み中に次のエラーメッセージ「ピアによる接続リセット」がスローされることです

例外コード:

public void write(byte[] buffer, int start, int end) {
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
    if (mmOutStream !=null) {
        try {
             mmOutStream.write(buffer);
        } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
        }
    }
    else{
        Log.e("OutputStream Null","");
    }
}

==更新==

両方のデバイスが接続されていることを示していますが、accept メソッドは失敗を返します

**06-19 10:30:23.625: D/BluetoothChatService(2630): connected
06-19 10:30:23.625: D/BluetoothChatService(2630): cancel Thread[AcceptThread,5,main]
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): abortNative
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): ...asocket_abort(50) complete
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): ...accept(50, RFCOMM) = -1 (errno 125)
06-19 10:30:23.632: E/BluetoothChatService(2630): accept() failed
06-19 10:30:23.632: E/BluetoothChatService(2630): java.io.IOException: Operation Canceled
06-19 10:30:23.632: E/BluetoothChatService(2630):   at android.bluetooth.BluetoothSocket.acceptNative(Native Method)
4

3 に答える 3

0

あなたの読み方は間違っていると思います。私はラインを持っています

while (true) {
    try {
        // read overhead from the InputStream
        bytes = mmInStream.read(buffer, 0, LEN_SIZE + LEN_TYPE);

私のコードでは、.available() なしで完全に機能しており、@gtRfnkN も同様です。Java ドキュメントの私の解釈から、.available() を InputStream で使用することはできません。http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()特に「クラス InputStream に対して常にゼロを返す」という部分を参照してください。

念のため、私の書き込みの例を次に示します。

    public void write(byte[] buffer){
        try{
            //a delay of 20ms occurs after each flush...
            mmOutStream.write((byte)buffer[0]);
            mmOutStream.flush();
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
于 2013-06-25T10:59:10.983 に答える