在BluetoothGatt.close()之后无法阻止Android重新连接

问题描述 投票:0回答:2

这似乎是一个奇怪的问题,因为我看到的大多数抱怨都是相反的;没有用户干预,一个人无法让Android自动重新连接到BTLE设备。

正常行为

在这种情况下,我连接到BTLE设备,在断开连接时,我调用BluetoothGatt.connect()并且不调用BluetootGatt.close()。现在在正常情况下,这将导致我想要的。当设备稍后重新通告时,Android将重新连接到它而无需用户干预。

关闭应用程序

现在我想关闭我的应用程序。所以我所做的是系统地删除我的所有BluetoothGattCallback对象。这些对象中的每一个都代表正在进行或未决的BTLE连接。删除涉及发送断开连接,最后在每个对象上调用BluetoothGatt.close()。

问题

但是,当设备再次开始广告时,它会从Android获取连接事件。但是没有任何应用程序可以处理它。设备保持该状态但没有进展,因为BTLE心跳包持续交换。当然,设备可能会超时并断开连接,但我发现问题出现在Android上。我不能把它关起来!

一个糟糕的解决方案

我能做的就是在Android上关闭蓝牙。这会释放连接并断开设备连接。我不认为这是一个有效的解决方案。

发生在我试过的所有机器人身上

在我尝试过的所有Android设备上都会出现这种情况,因此在关闭BluetoothCallback对象时必定会出现问题。这个“保持活跃”是挂起的connect()的结果吗?

android bluetooth-lowenergy
2个回答
0
投票

没有,只要你关闭,Android将删除待处理的连接(除非在其他应用程序中有其他BluetoothGatt对象引用同一设备)。你手机上还有其他正在运行的BLE应用吗?

您也可以调用disconnect(),然后调用close(),它应该执行相同的操作,但如果Android设备有错误的BLE堆栈,有时可能会更好。您测试过哪些设备?


0
投票

我知道这个问题已经过时但我会在设置我的Android应用时给出另一个答案。似乎只有当BluetoothGatt实例准备好被垃圾收集时才终止连接过程(对实例的所有引用都已被删除)。我不完全确定是这种情况,但它肯定通过非常有选择性地解决了我的问题,我抓住了引用,并将我的局部变量设置为null。

© www.soinside.com 2019 - 2024. All rights reserved.