Android:与蓝牙设备断开连接时出现异常

时间:2012-09-05 23:01:34

标签: android bluetooth try-catch

我正在寻找一种优雅地与蓝牙设备断开连接的方法。我使用了BluetoothChat示例,问题是当您打算断开连接时,只需从socket.close()方法调用cancel(),但IntputStream.read()将不可避免地抛出异常。

我之所以需要这个,主要是因为它充当了“丢失的连接”故障保护,所以当我尝试断开时,我得到两个信号:正常断开连接,然后丢失连接信号。

基本上我要做的就是不要在一个不可避免地抛出一个的方法中抛出异常:

while(true)
{
    try
    {
        bytes = 0;
        while((ch = (byte) inStream.read()) != '\0')
        {
            buffer[bytes++] = ch;
        }

        String msg = new String(buffer, "UTF-8").substring(0, bytes);
        Log.v(TAG, "Read: " + msg);

    }
    catch(IOException e)
    {
        Log.e(TAG, "Failed to read");
        // Inform the parent of failed connection
        connectionEnd(STATE_LOST);
        break;
    }
}

极端自私的cancel()

public void cancel()
{
    try
    {
        socket.close();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

修改

这是我在e.printStackTrace();catch时收到的错误代码:

09-06 13:05:58.557: W/System.err(32696): java.io.IOException: Operation Canceled
09-06 13:05:58.557: W/System.err(32696):    at android.bluetooth.BluetoothSocket.readNative(Native Method)
09-06 13:05:58.557: W/System.err(32696):    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:333)
09-06 13:05:58.557: W/System.err(32696):    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:60)
09-06 13:05:58.557: W/System.err(32696):    at com.bluetooth.BluetoothRemoteControlApp$ConnectedThread.run(BluetoothRemoteControlApp.java:368)

2 个答案:

答案 0 :(得分:0)

试试这个: 假设您有OutputStream的 out 对象和InputStream的 in 对象,那么 在取消内部关闭连接,如下所示:

public void cancel()
{
    if(socket != null)
        {
            try {
                out.close();
                in.close();
                socket.getOutputStream().close();
                socket.close();
                socket = null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace(); 
            }
        }
}

希望这能帮到你

答案 1 :(得分:0)

解决方案:它并不完美,但由于无法停止异常,我做了断开连接条件:

catch(IOException e)
{
    if(!disconnecting)
    {
        Log.e(TAG, "Failed to read");
        e.printStackTrace();
        // Inform the parent of failed connection
        connectionEnd(STATE_LOST);
    }
    break;
}
在调用disconnecting方法之前,

true设置为cancel()。我对此并不满意,但它不是丑陋。我对处理蓝牙断开连接的方式感到不满意(它可以正常工作或中断)。