3

接続に問題があります。デバイスのペアリングを解除しない限り、最初は機能しますが、機能しません。ソケットが閉じられた、パイプが閉じられた、接続が拒否された、ポートが既に使用されているなど、発生する可能性のあるすべての例外を取得しました。

android pre 4.2 ( https://code.google.com/p/android/issues/detail?id=37725 )の Bluetooth に問題があることは承知しています。

これらのデバイスの接続に問題があるデバイス:

  • Htc 1 (アンドロイド 4.2)
  • サムスン ギャラクシー s2 (アンドロイド 4.1.2)
  • ネクサス 4 (4.3)
  • サムスンギャラクシーs4 (4.2)

もう 1 つの小さな問題は、ペアリングされたデバイスが保存されないことです (主に nexus 4 と sgs2 で)。

これが私のコードです:

private static final UUID MY_UUID_SECURE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //this is the other one that I've tried: fa87c0d0-afac-11de-8a39-0800200c9a66");

private static final String NAME = "BluetoothConnector";

public void listenForConnection() throws IOException, BluetoothException {
//first close the socket if it is open
closeSocket();

BluetoothServerSocket mServerSocket = null;
try {
    mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID_SECURE); //ioexception here!         
} catch (IOException e) {
    if (Build.VERSION.SDK_INT >= 9) {
        try { //this is a stupid hack, http://stackoverflow.com/questions/6480480/rfcomm-connection-between-two-android-devices
            Method m = mBluetoothAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class });
            mServerSocket = (BluetoothServerSocket) m.invoke(mBluetoothAdapter, PORT);
        } catch (Exception ex) {
            Log.e(ex);
            throw e;
        }
    } else {
        throw e;
    }
}

while (!isCancelled) {
    try {
        socket = mServerSocket.accept();
    } catch (IOException e) {
        if (socket != null) {
            try {
                socket.close();
            } finally {
                socket = null;
            }
        }
        throw e;
    }

    if (socket == null) {
        throw new BluetoothException("Socket connection connected, but null");
    } else {
        isConnected = true;
        break; // everything is ok
    }
}
}



public void connect(String address) throws IOException, BluetoothException {
mBluetoothAdapter.cancelDiscovery();

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

try {
    socket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
} catch (IOException e1) {
    Log.e(e1);

    if (Build.VERSION.SDK_INT >= 9) {
        try {
            Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
            socket = (BluetoothSocket) m.invoke(device, PORT);
        } catch (Exception e) {
            Log.e(e);
            throw e1;
        }
    } else {
        throw e1;
    }
}

// Make a connection to the BluetoothSocket
try {
    // This is a blocking call and will only return on a
    // successful connection or an exception
    socket.connect();
} catch (IOException e) {
    Log.e(e);
    // Close the socket
    try {
        socket.close();
    } catch (IOException e2) {
        Log.e(e2);
        Log.wtf("unable to close() socket during connection failure");
    }
    throw e;
}

}

private void closeSocket() {
    try {
        if (socket != null) {
            socket.close();
            socket = null;
            Log.d("Socket closed");
        }
    } catch (IOException e) {
        Log.e(e);
        Log.wtf("close() of connect socket failed");
    }
}

私はuuid(ランダムなものも)を変更してみました。古いSDKサンプルを調べてみました。では、ここで何が間違っているのでしょうか?

編集:明確化しようとしています:問題は通常、ペアリングされ、接続され、通信に成功した2つのデバイスが(ユーザーによって)切断されたときに発生します。その後、再起動するか、手動でペアリングを解除しない限り、再接続できません。

4

2 に答える 2

1

この時点で Android の Bluetooth が壊れているようです。

常に機能する 2 つのデバイスを接続する確実な方法はありません。 一部の人々は非公式の方法を使用していますが、それはすべてのデバイスで機能するわけではありません.

現在市場に出回っているトップ 10 のデバイスを使用していくつかの社内テストを行ったので、約 90 回のテスト実行の後、ハッキングされた方法は 75% の確率で機能しましたが、これは十分ではありません。

たとえば、htc oneX は Bluetooth ハンズフリー デバイス (正常に接続されています!) として着信 Bluetooth 要求を処理するだけですが、メッセージングは​​不可能になります。

完全な Bluetooth 機能を実装した後、アプリから削除し、それなしでリリースすることにしました。今後のリリースで wifi に切り替える予定です。

于 2013-09-05T13:11:59.833 に答える