Ошибка в Android 2.1 Bluetooth SPP с Inputstream.read

70
8

Я пытаюсь подключить Bluetooth-адаптер, который отправляет мне некоторые данные после отправки Handshake.
Моя проблема заключается в том, что до тех пор, пока адаптер не отправит, код работает нормально, но если он остановлен, in.read(xxx Command блокирует любое действие). Я должен отключить адаптер и ждать суровые секунды, тогда возникает исключение, и Код возобновился.
Как это решить? (Я удалил обработку ошибок для лучшего понимания)


BluetoothAdapter bt_adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice bt_device = null;

//Bluetooth not supportet
if (bt_adapter == null) {
return false;
}

//enable Bluetooth
if (!bt_adapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
return false;
}

//search K01-Blue Adapter
Set<BluetoothDevice> pairedDevices = bt_adapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
String name = device.getName();
if (name.contains("K01-Blue")) {
bt_device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress());
break;
}
}
}

//Exit if no Adapter found
if(bt_device == null){ return false; }

//Create Socket
try {
UUID uuid =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
GlobalVars.bluetooth.bt_socket =GlobalVars.bluetooth.bt_device.createRfcommSocketToServiceRecord(uuid);
} catch (Exception e) {
e.printStackTrace();
}

//Exit if socket not created
if(bt_socket == null){ return false; }

/Connect to Socket, otherwise exit
try {bt_socket.connect();
} catch (IOException e1) {return false;}

//get InputStream
InputStream in = null;
try {in = GlobalVars.bluetooth.bt_socket.getInputStream();
} catch (IOException e1) {return false;}

//get OutputStream
OutputStream out = null;
try {out = GlobalVars.bluetooth.bt_socket.getOutputStream()
} catch (IOException e1) {return false;}

//Say hello to K01 Adapter
byte[] hello = {0x2F, 0x3F, 0x21, 0x0D, 0x0A};

try {out.write(hello);
} catch (IOException e1) {return false;}

//Listen to Answer of K01 Adapter
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];

try {
nRead = in.read(data, 0, data.length);
while (nRead != -1) {
nRead = in.read(data, 0, data.length);
buffer.write(data, 0, nRead);
}
} catch (IOException e1) {e1.printStackTrace();}

//Create String from Bytearray
String str1 = new String(buffer.toByteArray());

спросил(а) 2010-09-21T17:25:00+04:00 10 лет назад
1
Решение
57

Разве это не означает, что "блокировка" означает, что in.read() блокирует поток до тех пор, пока данные, поступающие из bluetooth?

Итак, если этот слушатель находится в собственном потоке, вам не нужен какой-либо is.available()?

ответил(а) 2011-05-13T15:16:00+04:00 9 лет, 4 месяца назад
69

Вот что сработало для меня:

static ByteArrayOutputStream readbuffer_to()
{
ByteArrayOutputStream found = new ByteArrayOutputStream();
long start = System.currentTimeMillis();
try {
if(GlobalVars.bluetooth.in.available() == 0){return found;}
int nRead = GlobalVars.bluetooth.in.read();
boolean catched = false;
while (true) {
if(GlobalVars.bluetooth.in.available() > 0)
{
found.write(nRead);
nRead = GlobalVars.bluetooth.in.read();
start = System.currentTimeMillis();

}
if(System.currentTimeMillis() - start > 5000) {break;}

}

} catch (IOException e1) {

}
return found;
}

ответил(а) 2011-02-02T12:18:00+03:00 9 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема