React Native安卓调用react-native-image-picker启动相机导致应用重启如何解决
问题排查与解决方案
排查步骤
- 检查当前项目
AndroidManifest.xml中MainActivity的配置:- 确认是否错误配置了
android:process属性,导致调起相机后主进程被系统回收 - 确认是否缺少必要的
android:configChanges配置,配置变更触发Activity重启
- 确认是否错误配置了
- 检查设备开发者选项中是否开启了「不保留活动」开关,开启后会在离开页面时自动销毁Activity,触发重启
- 验证是否为图片体积过大导致异常:你当前配置
quality: 1会返回最高质量原图,部分设备对Intent传递的大数据上限较低,容易触发崩溃,可先把quality调整为0.5测试是否还会重启 - 排查第三方库冲突:空项目运行正常说明是现有项目依赖导致,优先检查当前项目是否集成了其他相机/相册、权限管理、保活类的第三方库,临时注释相关库的初始化代码后重试
- 检查Application类的初始化逻辑:是否存在进程判断错误,导致相机相关进程启动时重复执行了主进程才需要的初始化逻辑,触发崩溃
对应解决方案
- 修正MainActivity配置,参考示例:
<activity android:name=".MainActivity" android:launchMode="singleTask" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:windowSoftInputMode="adjustResize">
- 调整launchCamera参数,限制返回图片尺寸减少内存占用,同时增加空判断避免空指针:
try { launchCamera({ quality: 0.8, // 可根据业务需求调整,不建议直接用1 maxWidth: 1920, // 限制最大宽度 maxHeight: 1080, // 限制最大高度 mediaType: 'photo', writeTempFile: true }, img => { if(img?.assets?.length && img.assets[0]) { this.setState({ img: {...img.assets[0], name: img.assets[0].fileName}, }) } }); } catch (e) { console.log(e); }
- 解决多进程初始化冲突问题,在Application的onCreate方法最前面增加进程判断,仅在主进程执行原有初始化逻辑:
String processName = getProcessName(); if (!getPackageName().equals(processName)) { // 非主进程直接返回,跳过主进程初始化逻辑 return; }
- 若以上方案都无效,可尝试升级react-native-image-picker到4.x版本的最新补丁版,或者降级到4.0.0版本验证,避免特定版本的兼容bug。
内容的提问来源于stack exchange,提问作者DiveDive
相关产品推荐
相关产品推荐

