使用 Android BLE Gatt 时如何接收重新连接通知

How to receive a notification on reconnect when using Android BLE Gatt

在 Android 上使用 BluetoothGattCallback 时,我可以通过覆盖 onConnectionStateChange 并检查 newState 字段来查看绑定设备何时连接和断开连接。但是,我想知道是否有一种方法可以通知我的应用程序重新连接,这就是我想象的当绑定设备暂时无法访问时的情况。

请注意,我在这里使用绑定设备,以便能够获得稳定的 MAC 地址。

关于答案

虽然我从未设法完全测试答案,但给出的答案对我来说确实有意义。我学到的一些东西:

以下问题的旧补充 - 现在应忽略

日志显示 onConnectionStateChange 被调用:

16:21:33.681 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:21:33.682 D/BluetoothGatt: registerApp()
16:21:33.683 D/BluetoothGatt: registerApp() - UUID=b4751d3b-ccdd-44c2-823e-deed18057af3
16:21:33.689 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
16:22:44.154 D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=57:D4:E9:34:A4:CB

如果设备后来断开连接,我也会看到状态变化:

16:24:25.800 D/BluetoothGatt: onClientConnectionState() - status=8 clientIf=6 device=57:D4:E9:34:A4:CB

如果设备在自动连接的情况下重新连接,则会重新建立连接,但我没有收到任何通知:

16:26:30.519 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:26:30.520 D/BluetoothGatt: registerApp()
16:26:30.521 D/BluetoothGatt: registerApp() - UUID=a973e2a7-b881-404a-875b-b2d25460e023
16:26:30.528 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7

那么,应用如何检测重新连接?

您应该做的是简单地调用 connectGatt 一次并将 autoConnect 参数设置为 true。当设备第一次连接时,您将收到 onConnectionStateChange 回调,表明它已连接。当连接由于某种原因断开时,您将收到 onConnectionStateChange 指示它现在已断开连接。但是您不必也不应该再次调用 connectGatt。一旦外围设备再次通告,您的 Android 设备将自动重新连接,您将获得 onConnectionStateChange.

这将一直有效,直到蓝牙被关闭(因为此时所有蓝牙对象都被静默销毁),或者您的应用进程被终止。开启蓝牙后,需要再次调用connectGatt