You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native安卓端RNCamera前置摄像头onTextRecognized无日志崩溃

React Native安卓端RNCamera切换前置摄像头无日志崩溃修复

问题复现场景

  • 技术栈:React Native 安卓端应用,使用react-native-camera的RNCamera组件
  • 触发条件:将摄像头从后置切换为前置时,应用直接闪退,JS控制台无任何相关错误日志输出
  • 出问题的组件代码:
<RNCamera
  ref={ref}
  autoFocus={RNCamera.Constants.AutoFocus.on}
  type={RNCamera.Constants.Type.front}
  androidCameraPermissionOptions={{
    title: 'Permission to use camera',
    message: 'We need your permission to use your camera',
    buttonPositive: 'Ok',
    buttonNegative: 'Cancel',
  }}
  onTextRecognized={({textBlocks})=>{console.log(textBlocks)}}
/>

对应修复方案

1. 修复前置摄像头自动对焦配置冲突

绝大多数安卓机型的前置摄像头不支持连续自动对焦,全局固定设置autoFocus={RNCamera.Constants.AutoFocus.on}时,切换到前置摄像头会直接触发Camera HAL层崩溃,这类原生层崩溃不会抛出到JS环境,所以console里看不到任何日志。
修复时根据当前摄像头类型动态调整对焦配置即可:

// 存储当前摄像头类型的状态
const [cameraType, setCameraType] = useState(RNCamera.Constants.Type.back)
// 前置关闭自动对焦,后置开启
const focusConfig = cameraType === RNCamera.Constants.Type.front
  ? RNCamera.Constants.AutoFocus.off
  : RNCamera.Constants.AutoFocus.on

<RNCamera
  // 其余原有配置保留
  type={cameraType}
  autoFocus={focusConfig}
/>

2. 解决文字识别模块的前置适配问题

代码里开启了onTextRecognized文字识别回调,该能力依赖ML Kit的帧处理逻辑,部分机型上切前置时,原有后置摄像头的识别会话没有被销毁,拿到不符合预期的前置预览帧会直接触发原生崩溃。
两种修复方式选其一即可:

  • 切换摄像头时通过更新组件key强制重挂载RNCamera,清空旧的识别会话:
const [cameraRenderKey, setCameraRenderKey] = useState(0)
const toggleCamera = () => {
  setCameraType(prev => 
    prev === RNCamera.Constants.Type.back 
      ? RNCamera.Constants.Type.front 
      : RNCamera.Constants.Type.back
  )
  setCameraRenderKey(prev => prev + 1)
}

<RNCamera
  key={cameraRenderKey}
  // 其余配置不变
/>
  • 如果前置摄像头场景不需要文字识别功能,切前置时直接置空onTextRecognized回调。

3. 补全安卓清单文件的硬件声明

打开android/app/src/main/AndroidManifest.xml,确认补全相机相关的权限和硬件特性声明,缺失前置摄像头特性声明时,部分定制安卓系统切前置会直接闪退:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

日志排查提示

这类无JS日志的崩溃基本都是原生层触发的,排查时不要只看Metro的console输出,打开Android Studio的Logcat面板,过滤AndroidRuntime、CameraHAL标签就能看到完整的原生崩溃堆栈。


内容的提问来源于stack exchange,提问作者Chanrithisak Phok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:00:09