带有Inputstream.read的Android 2.1蓝牙SPP出错

时间:2010-09-21 14:25:45

标签: android bluetooth

我尝试连接蓝牙适配器,在发送握手后向我发送一些数据。 我的问题是,在适配器发送之前,代码工作正常,但如果它停止了,in.read(xxx命令阻止任何执行。我必须关闭适配器并等待严重秒,然后发生异常并且代码恢复。 怎么解决这个? (我删除了错误处理以便更好地理解)

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());

2 个答案:

答案 0 :(得分:2)

这对我有用:

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;
     }

答案 1 :(得分:0)

是不是“阻塞”意味着in.read()阻塞线程直到数据来自蓝牙?

因此,如果此侦听器在自己的线程中,则不需要任何is.available()?