android - 关闭外设导致意外行为

标签 android bluetooth-lowenergy android-bluetooth

同时使用 Android 4.3/Samsung BLE 2.0 SDK,观察到当外围设备关闭时,SDK 将立即或在约 20 秒延迟后收到 onConnectionStateChange (DEVICE_DISCONNECTED)。根据我的经验,这取决于外围设备的实现,其中一些会尝试报告它们正在关闭,而有些则不会,因此 SDK 必须等待约 20 秒的超时时间。

为了消除这种行为,我尝试使用计时器来检查我是否可以读取某个特征。如果读取超时,我会调用disconnect(Android 4.3)/cancelConnection(Samsung)来终止连接。调用本身成功并且 onConnectionStateChange 回调返回状态 GATT_SUCCESS。然后我打开外围设备并立即连接到它,发现服务,并在我尝试读取/写入/通知任何通知时遇到问题。通过在 iOS 中使用 LightBlue,我可以确认外围设备未连接。

在关闭外围设备整整 20 秒后,我将收到一个 DEVICE_DISCONNECTED 回调。之后我再次连接,一切正常。

有两个问题: 1.我们是否应该在20s延迟期间连接到外设? 2. 有没有办法在外设关闭时得到通知?

提前致谢。

最佳答案

  1. 我们是否应该在 20 秒的延迟期间连接到外围设备? 不,从你的结果来看,操作系统似乎正在手机中执行一些操作来控制 DEVICE_CONNECTEDDEVICE_DISCONNECTED 事件,这可能是由于设备架构、安全性等多种原因造成的原因或回调本身延迟以节省能量

  2. 有什么方法可以在外围设备关闭时收到通知? 不,我不这么认为,接收到的任何 Action 的事件都是广播的,所以它正在等待来自它自己的设备的信号,但它没有收到信号,你在这里唯一能做的就是通过其他广播发送它(或 HTTP请求)从设备的另一端实现吧

关于android - 关闭外设导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372896/

相关文章:

java - Android ArrayList,意外停止

android - 如何覆盖 Android WebView 的 DNS 解析?

android - ImageSpan 中的可绘制选择器不起作用?

ios - 我可以只从一个蓝牙广播多个 ibeacon 信号吗?如何

android-bluetooth - java.lang.SecurityException : Need BLUETOOTH PRIVILEGED permission

Android:强制蓝牙

java - 需要解释 : how to use AsyncTask?

java - onServicesDiscovered 给出 'Method does not override method from its super class' 错误

android - 如何在不扫描的情况下连接ble设备?安卓4.3

android - Android 上蓝牙扫描和发现的差异