Android: setTorchMode 方法是一次性设置,在没有闪光灯的相机(前置摄像头)上设置为"关闭"会以"No flash unit"作为未处理的拒绝响应出现在每次安装时

作者: nicksrandall创建于 2026年7月7日更新于 2026年8月3日

发生了什么情况?

torchMode 属性设置为 任何 值 — 包括 'off' — 但绑定摄像头没有闪光灯单元的摄像头,会在每次安装/更新时产生 未处理的未完成的 promise

Error: java.lang.IllegalStateException: No flash unit
  at androidx.camera.camera2.impl.TorchControl.setTorchAsync-Oup_wC0$camera_camera2(TorchControl.kt:128)
  at androidx.camera.camera2.adapter.CameraControlAdapter.enableTorch(CameraControlAdapter.kt:115)
  at androidx.camera.core.impl.AdapterCameraControl.enableTorch(AdapterCameraControl.java:73)
  at com.margelo.nitro.camera.hybrids.HybridCameraController$setTorchMode$1.invokeSuspend(HybridCameraController.kt:205)
  ...
  mechanism: onunhandledrejection

[email protected] 中有两个相互叠加的原因:

  1. useTorchModeUpdater 从来不处理拒绝 ( src/hooks/internal/useTorchModeUpdater.ts):
typescript
useEffect(() => {
  if (controller == null) return
  if (torchMode == null) return
  controller.setTorchMode(torchMode)   // ← 返回的 Promise 既没有 await,也没有 .catch()
}, [controller, torchMode])

任何本地失败都会导致全局未处理的拒绝,应用程序无法捕获(没有适用的 onError 路由,也没有尝试/catch 的强制处理)。

  1. setTorchMode 无条件地调用 enableTorch ( android/.../HybridCameraController.kt:200): CameraX 的 TorchControl 会将返回的未来失败,并使用 IllegalStateException("No flash unit") 失败任何调用 enableTorch(...) 的摄像头没有闪光灯单元 — 甚至是 enableTorch(false)。没有 hasFlashUnit 预检查。

内容来源: mrousavy/react-native-vision-camera