Android 12 Pixel设备连接BLE为何两次弹出配对请求对话框
同类问题反馈
这个是Android 12上线后BLE开发领域的共性已知问题,不是操作失误或者设备故障:
- 所有升级到Android 12正式版的Google Pixel设备(Pixel 3/3a/4/4a/5/6系列)均能稳定复现该现象,除了nRF Connect、BLE Scanner这类通用调试工具,大量未做针对性适配的自研BLE应用也存在相同的双弹窗问题
- 部分厂商跟进Android 12的定制系统早期版本也存在同类问题,后续部分厂商通过系统补丁合并了弹窗逻辑,但Pixel设备的原生AOSP代码至今没有针对这个场景做官方修复。
Android 12与Android 11的BLE配对机制核心差异
双弹窗问题本质是Android 12蓝牙栈和权限模型调整时,没有做流程合并导致的原生逻辑问题,核心差异点如下:
- 权限模型拆分导致触发链路断裂:Android 11及更早版本中,BLE操作依赖的
BLUETOOTH、BLUETOOTH_ADMIN属于安装时授予的普通权限,应用发起配对请求后直接透传给系统蓝牙协议栈,整个配对流程只有蓝牙栈渲染的1次系统配对弹窗。Android 12将蓝牙权限拆分为BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE三个独立的运行时权限,当应用首次触发需要加密配对的GATT操作时,系统权限模块会先弹出1次确认框,校验应用是否具备BLUETOOTH_CONNECT权限的操作资格,权限校验通过后,蓝牙协议栈走标准SMP配对流程时会再弹出1次原生配对框,两次弹窗没有做合并,就出现了连续弹两次的现象。 - 绑定信息存储逻辑调整:Android 11及之前版本,BLE设备配对后的长期密钥(LTK)是全局存储在蓝牙栈缓存中,一次配对确认即可完成全链路的绑定标记写入。Android 12新增了应用维度的蓝牙绑定隔离机制,权限模块的应用授权标记、蓝牙栈的设备绑定密钥是分开存储的,两个模块各自维护自己的确认状态,首次配对时会各自触发对应的用户确认流程。
- 安全校验节点前置:Android 12将BLE连接的中间人攻击(MITM)防护校验从SMP配对阶段前移到了GATT连接建立阶段,当目标BLE设备开启了配对加密要求,系统在建立GATT链路前就会弹出一次安全风险确认提示,链路建立完成后进入标准配对流程时会再次弹出配对码输入/确认框,进一步放大了双弹窗的感知。
适配提示:自研BLE应用可以通过在发起连接前提前主动申请
BLUETOOTH_CONNECT运行时权限、连接成功后延迟1-2秒再触发需要加密的特征读写操作的方式,大幅降低双弹窗的出现概率。但nRF Connect这类通用调试工具无法提前预判用户要连接的目标设备,也不能提前触发权限申请流程,因此会稳定复现双弹窗问题。
内容的提问来源于stack exchange,提问作者Hsiao Indy
相关产品推荐
相关产品推荐

