随后在 BLE Android 应用程序中调用 disconnect() 和 close() 是正确的方法吗?

Is calling disconnect() and close() subsequently the right approach in BLE Android app?

我正在努力实现一个连接到 BLE 设备的 Android 应用程序,但缺乏适当的文档让我很沮丧。如果我 运行 该应用程序曾经可以运行但下一次停止在某个地方(不知道在哪里),但我得出的结论是我可能没有使用 disconnect()close() 的顺序正确。

让我们说一个错误之后我先调用 disconnect():

 public void disconnect() {
    mScanning = true;
    mConnected = false;
    startedConnect = false;
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        scanLeDevice(true);
        return;
    }
    mBluetoothGatt.disconnect();
    scanLeDevice(true);
}

然后我调用 close():

public void close() {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}

这是正确的做法还是错误的?请注意,我在断开连接后立即调用 scanLeDevice(true);,但随后调用了 close(),我认为这只是 "finishing" 一切并停止扫描,对吗?

当您通过在 BluetoothDevice 上调用 connectGatt 创建一个 BluetoothGatt 对象时,您在蓝牙堆栈。

在这个对象上,如果 Android 应该尝试保持与设备的连接或不是。在您调用 disconnect 之前,Android 将(永远)尝试连接到设备并在连接因任何原因断开时自动重新连接到设备。在 disconnect 之后再次调用 connect 将使其再次尝试连接。

注意:在初始 connectGatt 调用中将 autoConnect 设置为 false 将为第一次隐式连接尝试设置初始超时(通常为 30 秒),如果设备连接稍后连接断开,它不会自动尝试重新连接。

因此 BluetoothGatt 对象可以处于 "disconnected" 状态但仍占用蓝牙堆栈中的 32 个插槽之一。当您调用 close 时,您将 BluetoothGatt 对象和 return 插槽的所有资源释放到蓝牙堆栈。因此,关闭也隐含地意味着断开连接。要潜在地解决一些有问题的 Android 设备,您可以在 close 之前对 BluetoothGatt 对象调用 disconnect。请注意,一旦您调用了 close,您就不能对该 BluetoothGatt 对象调用任何其他方法。

注意:关闭蓝牙意味着自动销毁所有 BluetoothGatt 个对象。

回到你的问题,我不太明白你的BLE扫描有什么关系 connect/disconnect/close。扫描与连接和 BluetoothGatt 对象完全分开,同时连接和执行扫描没有问题。要停止扫描,请在 BluetoothLeScanner 上调用 stopScan