我正在开发Android应用。一开始,这个应用程序向用户显示蓝牙设备列表,当他选择其中一个打开其他活动时。
我的目标是:在用户重新打开应用程序的某一天之后,应用程序必须记住该设备,并且必须尝试重新连接它。
现在我已经通过这种方式获得了目标:
有一种获得同样东西的最佳方法吗?
关闭主题:ScanResult中的函数onScanResult有时会返回给我null设备,这是正常的吗? 我使用了startLeScan(UUID [] serviceUuids,BluetoothAdapter.LeScanCallback回调),在棒棒糖之后我使用了新版本的startLeScan和Scanfilter。这可能是问题吗?
答案 0 :(得分:4)
为了保护隐私,mac地址不断变化 - 请参阅以下摘录中的摘要:
5.4.5隐私权特征
Bluetooth LE支持的功能可以通过更改来降低在一段时间内跟踪LE设备的功能 蓝牙设备频繁地址。隐私功能是 没有在GAP发现模式和程序中使用但是在何时使用它 在连接模式和连接过程中受支持。为了 对于使用隐私功能重新连接到已知设备的设备, 设备地址,称为私有地址,必须是 可由其他设备解析。
私人地址是使用生成的 绑定期间交换的设备的解析身份密钥(IRK) 过程
所以理想的方法是使用IRK来设置设备的实际地址。但是我没有找到任何API来执行它。
目前,我在mny app中使用的工作 - 重新连接到设备,
对所有设备重复步骤2.
此解决方法仅在设备通过某项服务公开序列号时才有效。
当您致电connectGatt (Context context, boolean autoConnect, BluetoothGattCallback callback)
时,您也可以尝试将 autoconnect 标记设为true来自文档:
public BluetoothGatt connectGatt(Context context,boolean autoConnect, BluetoothGattCallback回调)在API级别18中添加
连接到此设备托管的GATT服务器。来电者充当关贸总协定 客户。回调用于将结果传递给调用者,例如 连接状态以及任何进一步的GATT客户端操作。该 方法返回一个BluetoothGatt实例。你可以使用BluetoothGatt 进行GATT客户操作。参数
autoConnect是否 直接连接到远程设备(false)或自动连接 远程设备可用后立即连接(true)。
回调GATT回调处理程序,它将接收异步 回调。如果回调为空,则抛出IllegalArgumentException