2016-01-30 2 views
1

Редактировать: получается, что он не генерирует исключение 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();} 

Однако она не работает, тост не отображается и время ожидания в любом случае (не цикл навсегда, как это было бы, если сделать нет связи).

+0

Какова цель определения трех разных ссылок на устройства Bluetooth? Также вы можете добавить logcat своей ошибки к вашему вопросу? –

+0

Не знаю, я просто скопировал/вставил код из https: //wingoodharry.wordpress.com/2014/03/16/simple-android-to-arduino-via-bluetooth-part-3 /, смешанный с кодом, который я нашел в нескольких других местах. Однако он работает отлично, поэтому я не думаю, что это так. Что касается logcat, у меня его нет, ADB не распознает мое устройство, и эмулятор слишком отсталый. – Zezombye

+0

Если adb не распознает ваше устройство, как вы запускаете приложение? –

ответ

0

Заменить Socket.connect() соединяется с

while(true){ 
    try { 
     socket.connect(); 
     //When we are here the connection suceeded 
    }catch (Exception e){ 
     //The connection failed 
    } 
} 

Однако будьте осторожны, чтобы не запускать это на UI тему, так как это будет блокировать поток и сделать ваше приложение не отвечает. Скорее создайте поток Searcher, который затем перезвонит, что он что-то нашел.

Вам не нужно линия

BluetoothDevice device = bt2; 

просто заменить устройство с BT2 в коде и удалить эту строку. Обратите внимание, что ваш цикл

for(BluetoothDevice bt : bondedDevices) { 
    bt2 = bt; 
} 

всегда даст вам последний элемент, который может привести к проблеме вы ищете для совершенно другого предмета, который вы хотите.

Смежные вопросы