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
相关产品推荐
相关产品推荐

