我在三星S6手机上开发了一个Android应用程序(Android版: - Lollipop)。 应用程序读取蓝牙端口上的数据并显示在屏幕上。
但是,蓝牙连接会在一段时间后丢失。 之后,蓝牙连续断开连接。
连接日志是: -
03-05 15:34:57.071:E / bt-btm(6152):重置sec_bd_name和name flag。 (BR / EDR链接)
03-05 15:34:57.071:E / bt-btm(6152):btm_sec_disconnected - 清除未决标志
无效的rfc广告位ID:91
03-05 16:37:42.490:W / bt-btif(6113):dm_pm_timer到期
03-05 16:37:42.490:W / bt-btif(6113):dm_pm_timer expires 0
03-05 16:37:42.490:W / bt-btif(6113):proc dm_pm_timer expires
当我重新启动手机时,一切正常。但问题会在一段时间后再次出现。
为什么会这样?如何在不断开连接的情况下保持连接?
编辑: - 我已经在多个版本的Android设备上测试了我的应用程序,除了三星S6之外,它在所有其他设备上都能正常工作。
答案 0 :(得分:1)
在一段固定的空闲时间后,蓝牙将自动断开连接。如果你使用普通的蓝牙外设,你就无所事事了。
要保持与蓝牙的持续连接,您需要检查应用程序中的空闲时间,并在一段固定的时间后通过OutputStream
发送垃圾数据。虽然这不是一个很好的方法,但可以很好地保持与蓝牙的连续连接。
你可以选择另一种可能会冻结你的应用程序的方法,每次蓝牙断开连接时都会创建一个rfcommSocket通信。当您注册BluetoothAdapter
以收听蓝牙通信状态时,您将获得断开连接意图。在这种方法中,您需要知道蓝牙设备的MAC地址。以下是如何创建rfcommSocket通信的示例:
private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
在BroadcastReceiver
的蓝牙意图过滤器中:
BluetoothDevice mDevice;
BluetoothSocket bs;
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getAddress().equals(YOUR_BT_MAC_ADDRESS)) {
mDevice = device;
bs = mDevice.createRfcommSocketToServiceRecord(MY_UUID);
mBluetoothAdapter.cancelDiscovery();
}
}
if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
try {
bs = mDevice.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {}
}
如果这与内存问题有关,请检查您的InputStream
和OutputStream
。从InputStream
读取,直到它没有被清除。