3

RFCOMM を使用して Bluetooth 経由でデバイスに接続する Android アプリを作成しています。接続を確立するための基礎として BluetoothChat の例を使用すると、ほとんどの場合、すべてが完全に機能します。

ただし、ソケットが既に開いているというメッセージが原因で、再接続できない場合があります。

RFCOMM_CreateConnection - すでに開かれている状態:2、RFC 状態:4、MCB 状態:5

これは、デバイスに接続し、アプリを閉じて (onDestroy() を呼び出し)、再度開いて再度接続しようとすると、上記の結果になる傾向があります。

ConnectThread (ref.BluetoothChat の例) での接続には、このメソッドを使用します。

Method m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));  
mmSocket = tmp;

この問題を解決する唯一の方法は、Android フォンの Bluetooth をオフ/オンにすることです。

これにより、onDestroy() でソケットが閉じられていないと思われますが、前述の例に示すように、すべてのスレッドを閉じることを呼び出しています。
どんなアイデアでも大歓迎です。

4

1 に答える 1

4

私もこれに出くわしました、そしてここに私が見つけた答えがあります:

Bluetoothソケット接続を複数回開閉すると、このエラーが発生する可能性があります。

解決

APIレベル14から、 isConected()と呼ばれるBluetoothSocketのメソッドがあります。このメソッドは、このソケットがすでに接続されている場合はtrueを返し、そうでない場合はfalseを返します。APIからの元の抜粋です。

このソケットの接続ステータス、つまり、リモートデバイスとのアクティブな接続があるかどうかを取得します。

APIレベルが14未満の場合、接続を閉じた後にBluetooth処理スレッドをスリープ状態にすることでこの問題を回避できます。1000ミリ秒で十分です。例を次に示します(btDeviceはBluetoothDeviceタイプであり、コードスニペットの前に初期化されています下):

    try {
        //Open the socket to an SPP device (UUID taken from Android API for createRfcommSocketToServiceRecord)
        BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
        //Connect to the socket
        btSocket.connect();
        //Close the socket
        btSocket.close();
        //Sleep time of 1000ms after closing the socket
        SystemClock.sleep(POST_RESET_DELAY);

    } catch (Throwable e) {
        // Log error message
    }

Ps SystemClock.sleepの代わりにThread.sleepを使用することもできますが、SystemCockのスリープは中断できませんが、Thread.sleepは中断できるため、ユースケースによって、どちらのオプションが目的に適しているかによって異なります。

出典:ルイA.プラド

于 2012-07-03T08:20:11.703 に答える