Я сделал ListView
с устройствами, в настоящее время сопряженными с моим телефоном, чтобы я мог выбрать одно из них и подключиться к нему. Чтобы определить, какое устройство было выбрано, я сохраняю их MAC-адреса в массиве, чтобы получить устройство по его адресу. Когда я выбираю устройство, приложение на некоторое время зависает, а затем восстанавливается без успешного подключения. Я нигде не могу найти решение, и я застрял. Я все еще новичок и не очень понимаю. Возникает исключение, которое выглядит следующим образом:
java.io.IOException: read failed, socket might be closed or timeout, read ret: -1
Вот мой код
// If the UUID is incorrect then this one does not work as well
// 00001101-0000-1000-8000-00805f9b34fb
private static final UUID CONNECTION_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
public static boolean connectDevice(final int a) {
try {
BluetoothDevice mBluetoothDevice = btAdapter.getRemoteDevice(deviceAddress[a]);
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);
btAdapter.cancelDiscovery();
mBluetoothSocket.connect();
mmOutputStream = new DataOutputStream(mBluetoothSocket.getOutputStream());
mmInputStream = new DataInputStream(mBluetoothSocket.getInputStream());
mBluetoothSocket.close();
} catch (NullPointerException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
Исходя из CONNECTION_UUID
который вы указали в своем коде, я предполагаю, что вы подключаетесь через последовательную плату Bluetooth. Я еще не уверен в проблеме, однако я подумал написать этот ответ, чтобы найти вероятное решение, которое может решить вашу проблему.
Я думаю, что в случае сопряженных устройств, вам нужно инициировать соединение по безопасному каналу. В настоящее время вы используете небезопасный канал.
Из документации...
Канал связи не будет иметь аутентифицированного ключа связи, то есть он будет подвергаться атакам "человек посередине". Для устройств Bluetooth 2.1 ключ связи будет зашифрован, поскольку шифрование обязательно. Для устаревших устройств (до Bluetooth 2.1 устройств) ключ связи не будет зашифрован. Используйте createRfcommSocketToServiceRecord (UUID), если требуется зашифрованный и аутентифицированный канал связи.
Следовательно, вы можете рассмотреть возможность использования createRfcommSocketToServiceRecord()
для вашего случая.
Вместо этого
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);
Использовать этот...
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);
Я надеюсь, что это решит вашу проблему.
00001101-0000-1000-8000-00805f9b34fb