这似乎是一个奇怪的问题,因为我看到的大多数抱怨都是相反的;一个人无法让Android在没有用户干预的情况下自动重新连接到BTLE设备。
正常行为
在这种情况下,我连接到BTLE设备,在断开连接时,我调用BluetoothGatt.connect()并且不调用BluetootGatt.close()。现在在正常情况下,这将导致我想要的。当设备稍后重新通告时,Android将重新连接到它而无需用户干预。
关闭应用
现在我要关闭我的应用。所以我所做的是系统地删除我的所有BluetoothGattCallback对象。这些对象中的每一个都代表正在进行或未决的BTLE连接。删除涉及发送断开连接,最后在每个对象上调用BluetoothGatt.close()。
问题
然而,当设备再次开始广告时,它会从Android获取连接事件。但是没有任何应用程序可以处理它。设备保持该状态但没有进展,因为BTLE心跳包持续交换。当然,设备可能会超时并断开连接,但我发现问题出现在Android上。我不能把它关起来!
一个糟糕的解决方案
我可以做的是在Android上关闭蓝牙。这会释放连接并断开设备连接。我不认为这是一个有效的解决方案。
发生在我尝试的所有机器人上
在我尝试的所有Android设备上都会出现此行为,因此在关闭BluetoothCallback对象时必定会出现问题。 这是“保持活跃”是挂起的connect()的结果吗?
答案 0 :(得分:0)
否则,只要您关闭,Android就会删除待处理的连接(除非在其他应用程序中有其他BluetoothGatt对象引用同一设备)。你手机上还有其他正在运行的BLE应用吗?
您也可以调用disconnect(),然后调用close(),它应该执行相同的操作,但如果Android设备有错误的BLE堆栈,有时可能会更好。您测试过哪些设备?
答案 1 :(得分:0)
我知道这个问题很旧,但是我将给出在设置Android应用程序时发现的另一个答案。似乎只有在准备好对BluetoothGatt实例进行垃圾回收时(该实例的所有引用都已删除),连接过程才会终止。我不完全确定是这种情况,但是通过非常有选择性地选择获取引用的位置以及将局部变量设置为null的位置,可以肯定地解决了我的问题。