Редактировать: получается, что он не генерирует исключение IOException, а исключение NullPointerException (потому что outputStream равно null). Поймать его отлично работает, пытаясь написать из outputStream.Android: Как предотвратить сбой приложения при отправке чего-либо через Bluetooth, пока он не подключен?
Однако при попытке прочитать из InputStream по какой-то причине перехват NullPointerException не сработал, поэтому я просто добавил проверку if (inStream !=null)
перед вызовом метода, который читает из inputStream.
Так хорошо, я решил проблему.
Итак, у меня есть приложение, которое среди прочего подключается к устройству через Bluetooth и может посылать/ПОЛУЧИТЕ строки.
Однако может случиться так, что соединение выходит из строя, либо из-за отключения сопряженного устройства, либо из-за того, что устройство не выбрало соединение. В этом случае, когда я пытаюсь отправить строку, мое приложение падает.
Как предотвратить этот крах, а вместо этого отобразить тост и попытаться снова подключиться? В окружении IOException ничего не происходит.
Возможно полезно код:
Способ инициировать соединение:
private void init() throws IOException {
if (blueAdapter != null) {
if (blueAdapter.isEnabled()) {
Set<BluetoothDevice> bondedDevices = blueAdapter.getBondedDevices();
if(bondedDevices.size() > 0){
BluetoothDevice bt2 = null;
for(BluetoothDevice bt : bondedDevices) {
bt2 = bt;
}
BluetoothDevice device = bt2;
ParcelUuid[] uuids = device.getUuids();
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuids[0].getUuid());
socket.connect();
outputStream = socket.getOutputStream();
inStream = socket.getInputStream();
}
Log.e("error", "No appropriate paired devices.");
}else{
Log.e("error", "Bluetooth is disabled.");
}
}
}
метод, чтобы написать строку:
public void write(String s) throws IOException {
outputStream.write(s.getBytes());
}
код, который записывает строку:
try {
write(string);
} catch (IOException e1) {
Toast.makeText(getBaseContext(), "Couldn't send the code.", Toast.LENGTH_SHORT).show();
}
Изменить: Я пытался добавить проверку в методе инициализации:
if (!socket.isConnected()) {
toast("Couldn't connect. Reconnecting...");
init();}
Однако она не работает, тост не отображается и время ожидания в любом случае (не цикл навсегда, как это было бы, если сделать нет связи).
Какова цель определения трех разных ссылок на устройства Bluetooth? Также вы можете добавить logcat своей ошибки к вашему вопросу? –
Не знаю, я просто скопировал/вставил код из https: //wingoodharry.wordpress.com/2014/03/16/simple-android-to-arduino-via-bluetooth-part-3 /, смешанный с кодом, который я нашел в нескольких других местах. Однако он работает отлично, поэтому я не думаю, что это так. Что касается logcat, у меня его нет, ADB не распознает мое устройство, и эмулятор слишком отсталый. – Zezombye
Если adb не распознает ваше устройство, как вы запускаете приложение? –