Android蓝牙低功耗:连接后无法发现服务

4
我正在尝试使用Android的低功耗蓝牙来与BLE设备通信。第一次连接时,一切正常(连接到GATT服务器、发现所有服务和特征等)。但是,如果我断开连接并尝试重新连接,则会连接到GATT服务器,但无法发现服务。我必须杀掉应用程序并重新启动它,有时甚至这样也行不通。
以下是我用于断开与设备连接的代码:
public void close(View view) {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}

断开连接时还有其他需要做的事情吗?似乎仍然有某些资源处于连接状态,导致在尝试重新连接时无法发现服务。

1个回答

4
我似乎找到了解决方案:您需要同时调用BluetoothGatt.disconnect()BluetoothGatt.close()

从技术角度来说,您需要调用 BluetoothGatt.disconnect(),然后[因为不能保证 onConnectionStateChange 被调用] 启动计时器,等待 onConnectionStateChange 状态=STATE_DISCONNECTED 或超时,然后调用 BluetoothGatt.close()。 - swooby
@swooby你能提供一个源吗?它提到了在调用close之前需要等待STATE_DISCONNECTED的必要性吗?谢谢! - stkent
有趣的是,尽管我在关闭之前调用了断开连接,但我在日志中没有观察到那个跟踪。不过,我现在正在查看nougat。感谢提供链接! - stkent
你可以在断开连接后直接调用close方法。唯一可能发生的不好的事情是日志中会打印出一个警告。你应该避免在connectGatt之后立即调用disconnect或close方法,因为由于内部竞争条件,这些调用可能会被忽略。 - Emil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接