我正在开发一个Android BLE应用程序,我尝试在应用程序和BLE设备之间建立稳定的连接。
为实现这一点,我希望我的应用程序将BLE设备数据保存在共享首选项或某处。
应用程序关闭后,我希望我的应用程序可以检索此数据并尝试连接而无需扫描设备。
我更喜欢每次都避免扫描因为扫描给我带来了很多问题而且需要时间。
怎么办?有没有办法保存BLE数据?
答案 0 :(得分:5)
您需要将设备的蓝牙设备地址(AB:CD:EF:01:02:03)存储在例如共享首选项或sqlite数据库中。然后在稍后重新启动应用程序以检索BluetoothDevice对象时使用https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#getRemoteDevice(java.lang.String)。获得BluetoothDevice对象后,您可以照常使用connectGatt方法。
但是,您需要记住一些未记录的事项。由于Android的BLE API中存在一些可怕的设计缺陷,因此如果您指的是给定地址是公共地址或随机地址,则无法告诉它。 (您可以在https://devzone.nordicsemi.com/question/43670/how-to-distinguish-between-random-and-public-gap-addresses/了解有关不同地址类型的更多信息。 getRemoteDevice方法应该采用附加参数"随机地址/公共地址"但它并没有。如果没有正确的地址类型,蓝牙控制器将无法连接到设备。
Android的BLE堆栈有一些内部启发式算法来猜测"猜测"如果地址是公开的或随机的,但不幸的是,Android版本之间以及使用autoConnect = true或false时也是如此。但是,如果您已绑定设备(https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createBond()),则它将在其内部数据库中存储给定地址是公共地址还是随机地址。如果要连接的外围设备使用随机可解析地址,则在使用绑定时也可以处理该地址。因此,我强烈建议使用粘合。
如果您不使用绑定,则需要在连接设备之前进行扫描,因为当您开始扫描并检测到设备时,Android的BLE堆栈将暂时(直到下次重启蓝牙)记住地址的地址类型。
答案 1 :(得分:1)
我将继续回答Emil。 感谢@Emil的“大介绍”。
因此,您唯一的解决方案是蓝牙扫描。
但是,由于Android6(棉花糖),用户必须使用蓝牙扫描为应用授予位置权限。如果你不允许的话,那是行不通的。
因此,如果您购买了蓝牙体温计(或心律监测器等),则必须允许该应用访问手机(或平板电脑)的位置。
太荒谬了!
@Emil称其为“ Google漏洞”。您也可以称其为“ Google机器”。
如果我是温度计设计师,我会添加一个按钮来接受粘接。看起来很荒谬,因为该按钮只能使用一次。
[1]:https://www.polidea.com/blog/a-curious-relationship-android-ble-and-location/