gpt4 book ai didi

Android保存BLE设备以在应用关闭后重新连接

转载 作者:行者123 更新时间:2023-11-29 14:30:06 31 4
gpt4 key购买 nike

我正在开发一个 Android BLE 应用程序,我尝试在该应用程序和 BLE 设备之间建立稳定的连接。

为了实现这一点,我希望我的应用程序将 BLE 设备数据保存在共享首选项中或某处。

应用关闭后,我希望我的应用能够检索此数据并在不扫描设备的情况下尝试连接。

我宁愿避免每次都扫描,因为扫描给我带来了很多问题并且需要时间。

怎样才能做到呢?有没有办法保存BLE数据?

最佳答案

您需要将设备的蓝牙设备地址 (AB:CD:EF:01:02:03) 存储在共享首选项或 sqlite 数据库中。然后使用 https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#getRemoteDevice(java.lang.String)当您稍后重新启动应用程序以检索 BluetoothDevice 对象时。获得 BluetoothDevice 对象后,您可以照常使用 connectGatt 方法。

但是,您需要牢记一些未记录的内容。由于 Android 的 BLE API 中存在一些可怕的设计缺陷,因此无法判断给定地址是公共(public)地址还是随机地址。 (您可以在 https://devzone.nordicsemi.com/question/43670/how-to-distinguish-between-random-and-public-gap-addresses/ 阅读更多关于不同地址类型的信息)。 getRemoteDevice 方法应该采用附加参数“随机地址/公共(public)地址”,但它没有。如果地址类型不正确,蓝牙 Controller 将无法连接到设备。

Android 的 BLE 堆栈有一些内部启发式方法可以“猜测”地址是公共(public)地址还是随机地址,但不幸的是,这在 Android 版本之间以及您使用 autoConnect=true 还是 false 时有所不同。但是,如果您绑定(bind)了设备(https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createBond()),那么无论给定地址是公共(public)地址还是随机地址,它都会存储在其内部数据库中。如果您要连接的外围设备使用随机可解析地址,如果您使用绑定(bind),它也可以处理该地址。因此我强烈建议使用绑定(bind)。

如果您不使用绑定(bind),您将需要在连接到设备之前进行扫描,因为当您开始扫描并检测到设备时,Android 的 BLE 堆栈将暂时(直到下次重新启动蓝牙)记住地址类型获取地址。

关于Android保存BLE设备以在应用关闭后重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43476369/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com