Skip to Content
硬件接入传输协议Android (原生)

Android:通过蓝牙连接(原生)

在 WebView 中运行 @onekeyfe/hd-common-connect-sdk,通过底层传输插件桥接到原生 BLE。以原生 Android 示例 和底层传输插件契约为起点。

原生层负责权限、配对、GATT 连接、特征读写和清理;SDK 负责协议探测、帧处理和签名。不要在原生桥中再实现一套 V1/V2 解码器。

权限

面向 Android 12 及以上版本的应用,需要在运行时请求 BLUETOOTH_SCAN 和 BLUETOOTH_CONNECT。仅扫描和连接的客户端不需要 BLUETOOTH_ADVERTISE。

只有应用不通过 BLE 扫描推断位置时,才能使用 neverForLocation。较旧的 Android 版本需要相应的旧版蓝牙和位置权限;不要在旧设备上无条件请求 Android 12 才提供的权限。按目标 SDK 和位置用途核对 Android 蓝牙权限指南 。

权限请求未完成前不要开始扫描。用户拒绝时,应向 JS 调用方返回权限失败结果,并允许用户之后主动重试。

构建并加载 JavaScript 包

在 hardware-js-sdk 仓库中运行:

cd packages/connect-examples/native-android-example/web yarn yarn build

将 web_dist/ 复制到 app/src/main/assets/web_dist/。加载 file:///android_asset/web_dist/index.html 前,先注册原生桥接处理器。保持资源相对路径不变;具有设备桥接能力的 WebView 只加载应用自己可信的资源包。

演示包含所需依赖和完整桥接实现。以它的 package 和 Gradle 配置为起点,不要混用不同 Nordic BLE 版本的零散代码。

完成 BLE 连接后再返回成功

固定延迟不能证明配对、GATT 连接、服务发现或通知订阅已经成功。应等待回调或 BLE 库提供的异步完成接口:

  1. 完成所需配对,处理用户拒绝和超时。
  2. 等待 GATT 连接成功。
  3. 发现 OneKey 服务及所需的写入、通知特征。
  4. 启用通知,并等待描述符写入或订阅完成。
  5. 只有连接具备实际收发能力后,才完成桥接的 connect 请求。

Android 通过 BluetoothGattCallback 返回操作结果。成功发起操作不等于操作已完成。为每个待处理操作设置超时;失败时关闭连接,并拒绝其待处理桥接请求。

用途UUID
服务00000001-0000-1000-8000-00805f9b34fb
写入00000002-0000-1000-8000-00805f9b34fb
通知00000003-0000-1000-8000-00805f9b34fb

桥接契约

方法完成条件
enumerate()返回去重后的候选设备快照;停止扫描,每个请求只完成一次。
connect(uuid)连接、特征及通知均已就绪。
send(uuid, data, options)校验十六进制数据,按顺序写入字节,遵守 withoutResponse,传回写入失败。
receive(uuid)返回队列中的下一个原始通知块,格式为十六进制;读者开始等待前收到的块也必须保留。
disconnect(uuid)取消订阅、关闭所选连接、拒绝待处理读取,并丢弃旧通知数据。

每条连接独立维护队列和回调。缺少特征时应返回失败,不能把可空写入当作成功。WebView 桥接回调应切换到所需的 UI 线程。

实现 Protocol V2 时,通过 getProtocolV2PacketCapacity 暴露真实的 BLE 写入容量,不要返回包含 ATT 开销的 MTU。完整接口见底层传输插件。

SDK 与 UI 生命周期

资源包用 env: 'lowlevel' 和你的插件初始化 SDK。检查初始化结果,发现连接后调用 getDeviceState(connectId) 读取种子生命周期内的 deviceId。

受保护调用前注册 UI 事件处理器。只回答输入请求,并转发其响应关联字段。REQUEST_BUTTON 和设备端 PIN 提示是通知;原生界面的“确定”按钮不能代替硬件确认。

标准钱包的地址和签名调用传 useEmptyPassphrase: true;隐藏钱包传入所选钱包的 passphraseState。同一设备的调用按顺序执行。

验证集成

在真机上覆盖权限拒绝、配对取消、发现失败、通知订阅失败、锁定设备输入、断连和重连。让用户在设备上确认地址,并检查 SDK 结果。仅发现 BLE 广播不代表端到端流程通过。

超时后不要自动重放签名或固件升级。参见断线与重连。

最后更新于