接続に問題があります。デバイスのペアリングを解除しない限り、最初は機能しますが、機能しません。ソケットが閉じられた、パイプが閉じられた、接続が拒否された、ポートが既に使用されているなど、発生する可能性のあるすべての例外を取得しました。
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つのデバイスが(ユーザーによって)切断されたときに発生します。その後、再起動するか、手動でペアリングを解除しない限り、再接続できません。