У меня есть два приложения, A и B. Оба подключаются к устройству Bluetooth профиля с последовательным портом (SPP) с общим UUID 00001101-0000-1000-8000-00805f9b34fb
. Если приложение A подключено к моему устройству, при вызове mSocket.connect()
приложение B немедленно выдаст исключение:
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
Я хочу, чтобы приложение B всегда имело приоритет при подключении к моему устройству Bluetooth.
Я пробовал метод isConnected () BluetoothSocket, но в приложении B есть другой сокет.
Я могу отключить Bluetooth, чтобы встряхнуть соединение приложения A, но это решающее время и решение.
Вот мой код. Сначала я создаю сокет
UUID SERIAL_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
private void createSocket(){
// Close the socket before creating a new one.
if(mSocket != null){
forceCloseSocket();
}
BluetoothSocket tmp = null;
try {
tmp = mDevice.createRfcommSocketToServiceRecord(SERIAL_UUID);
} catch (IOException e) {
Log.e(TAG, "Socket's create() method failed", e);
}
mSocket = tmp;
}
}
Затем я подключаюсь к сокету.
private boolean doConnect() {
// Start connection timeout countdown
mCountDownTimer.start();
try {
// Try to connect to socket
mSocket.connect();
// Connection successful, get output stream
mOutStream = mSocket.getOutputStream();
} catch (IOException e) {
// Connection not successful, cancel timeout countdown
mCountDownTimer.cancel();
return false;
}
mCountDownTimer.cancel();
// Create and start read thread
mReadThread = new BluetoothReadThread(mSocket, mCallback);
mReadThread.start();
return true;
}
К сожалению, приведенное выше исключение точно такое же, как когдасопряженное устройство вообще недоступно. Единственное отличие состоит в том, что когда устройство недоступно, пройдет несколько секунд, прежде чем выдать это исключение. Пока что эта задержка - единственный способ определить, подключено ли к устройству другое приложение.