1

我试图找出是否可以可靠地检测到与(非音频)设备的蓝牙连接何时丢失。Android SDK 提供了一个蓝牙聊天示例,该示例使用以下代码段:

public void run() {
    Log.i(TAG, "BEGIN mConnectedThread");
    byte[] buffer = new byte[1024];
    int bytes;

    // Keep listening to the InputStream while connected
    while (true) {
        try {
            // Read from the InputStream
            bytes = mmInStream.read(buffer);

            // Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            Log.e(TAG, "disconnected", e);
            connectionLost();
            break;
        }
    }
}

当我在不使用应用程序的情况下启动线程并在 12 小时后断开设备连接时,这种方法有多可靠(服务在后台运行)。当然,服务总是可以被杀死?

然后是广播。我的应用会一直收到这些广播吗?什么时候不会?我已经尝试通过在 AndroidManifest 中使用它来实现它:

    <receiver android:name="MyReceiver" >
        <intent-filter>
            <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
            <action android:name="android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED" />
            <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
        </intent-filter>
    </receiver>

我在很短的时间内测试了这两种方法,并且都有效。如前所述,我不确定当手机长时间闲置时这些是否可靠。

谁能对此有所了解?

4

1 回答 1

1

蓝牙中的每个活动都有一个与之关联的超时。它因设备而异。

只要您启用了蓝牙服务,它就会在后台运行。ACL [Asynchronous Connection Less] 包一般用于传输非语音相关的数据。ACL 就像两个蓝牙设备之间的连接通道。这可能会根据不活动计时器或超时值断开连接。

您可以读取调用 HCI createConnection API 时设置的连接超时。此信息可以通过执行 hcidump 工具获取。http://www.bluez.org/download/

于 2013-01-15T12:42:44.800 回答