Files

Android Wrapper 输出说明

该目录会在执行 pnpm build:android 后被复制到 dist/android/wrapper,用于交付给 Android 原生宿主工程。

目录内容

  • ../mavenbrownfield AAR 及其依赖对应的 Maven 仓库
  • wrapper/:对外暴露 DuooomiBleManagerDuooomiBleRuntime 的 Android Library 模块

宿主 App 接入步骤

  1. dist/android/maven 配置为宿主工程可访问的 Maven 仓库。
  2. dist/android/wrapper 作为 composite build 引入,或者直接把 wrapper 模块复制到宿主工程。
  3. 在宿主 App 的一个长期存在的容器里挂载 Brownfield 对应的 React Native View。
  4. 运行时启动后,通过 runtime.manager 调用蓝牙能力。

最小使用示例

val runtime = DuooomiBleRuntime()
runtime.start(container = rootView) { context ->
  createReactNativeView(context)
}

lifecycleScope.launch {
  val result = runtime.manager.connect(deviceId = "device-id")
  Log.d("DuooomiBle", result.toString())
}

如果是扫描,仍然沿用监听方式:

runtime.manager.onDiscoveredDevicesChange = { devices ->
  Log.d("DuooomiBle", devices.toString())
}

runtime.manager.scan()

如果宿主需要先初始化 Brownfield Host

val runtime = DuooomiBleRuntime()
runtime.start(
  container = rootView,
  initializeHost = {
    initializeBrownfieldHost()
  }
) { context ->
  createReactNativeView(context)
}

说明

  • DuooomiBleRuntime 负责挂载隐藏的 RN 容器并启动 JS 运行时
  • DuooomiBleManager 的大部分命令方法为 suspend,例如 connectbindtransferFile
  • scan / stopScan 仍然保持事件监听方式
  • DuooomiBleManager 负责发送 expo-brownfield 消息和订阅 BrownfieldState
  • createReactNativeView(context) 需要由宿主工程提供,因为不同宿主的 Brownfield 接入方式可能不同

如果没有先调用 DuooomiBleRuntime.start(...),那么 JS 入口不会真正启动,scanconnect 等调用也不会生效。