为什么我们可以通过BroadcastReceiver 与BLE 设备配对,而不显示系统Dialog?

Why can we pair with the BLE device, without displaying system Dialog, by using BroadcastReceiver?

我正在使用 RxAndroidBle 库来扫描和连接 BLE 设备。我还需要与这个找到的设备配对,而不显示有关密钥配对的系统对话框。绑定机制是JustWorks.

我已经通过创建 BroadcastReceiver 实现了这一点,遵循我在下面发布的要点(感谢@dglozano)。

代码要点: https://gist.github.com/dglozano/9b0ce38a558eeca16137909bd368698c

它实际上工作得很好,但我想了解为什么当我简单地使用 rxBleDevice.bluetoothDevice.createBond() 它显示 Dialog 但当我自己处理它时 BroadcastReceiver 然后,它没有。这是否以某种方式注销了可以处理设备 BOND_STATE 的普通 BroadcastReceiver?为什么我的 BroadcastReceiver 主要控制它?我感兴趣的是 - 当我注册自己的 receiver.

时内部会发生什么

好的,我明白了。

我的第一印象是 BroadcastReceiver 处理这个系统 Dialog 是错误的。我们仅使用此 Receiver 来复核 BOUND_STATE。它与配对对话框无关,这个假设是错误的。

所以第一个重要的事实是配对只需要一个 createBond() 方法。剩下的就是建立它。

最重要的事实是,这是 "Just works" 配对方法。 There 我们可以阅读有关 BLE 安全性和 "Just works" 的内容。你可以在这里阅读:

In this method, the TK is set to 0.

TK 是临时密钥。 现在,让我们暂时回到我们的 Android createBond() 方法。在文档中我们可以看到:

Android system services will handle the necessary user interactions to confirm and complete the bonding process.

但如果它处理用户交互,为什么它不显示对话框?当我们将这两件事结合在一起时,我们就会找到答案。当临时密钥值设置为 0 时,Android 处理程序不需要显示配对密钥对话框。

Bluetooth 4.0/4.1 和 Bluetooth 4.2 之间存在细微变化,但应该不会对此行为产生影响。您可以阅读更多相关信息 here

TL:DR 使用 "Just works" 配对方法意味着临时密钥值设置为 0,这意味着我们在配对过程中不需要它。 createBound() 方法只处理必要的用户交互,所以当我们不需要配对密钥时,我们不需要与用户交互。这就是 Dialog 未显示的原因 - 因为没有必要。