React Native使用react-native-share分享二维码安卓App崩溃求助
问题背景
在RN 0.68.1项目中使用react-native-share 7.6.6分享base64格式的二维码图片时,出现以下问题:
- 点击发送按钮后App崩溃
- 分享操作偶发成功偶发失败
- 分享界面打开速度明显慢于正常情况
原分享代码如下:
async ShareQR(media) { var base64Data = "data:image/png;base64," + media const title = "App" const shareOptions = { url: base64Data, title: title, message: 'App' } try { const res = await Share.open(shareOptions, function(e) { console.log(e) }) console.log(res) } catch (err) { console.log("This error", err) } }
核心原因
直接传递完整的base64编码字符串作为url参数存在两个关键问题:
- 较大的base64字符串会占用大量内存,导致分享界面加载卡顿,甚至触发内存溢出崩溃
- 部分第三方应用(如Gmail)对base64格式的
url支持不完善,引发偶发失败
解决方案
方案1:将base64保存为本地文件后分享(推荐)
通过将base64图片写入本地临时文件,分享文件路径而非base64字符串,能有效解决内存占用和兼容性问题。以下是基于react-native-fs的实现示例:
- 安装依赖:
npm install react-native-fs --save
- 修改分享函数:
import RNFS from 'react-native-fs'; async ShareQR(media) { const title = "App"; // 生成临时文件路径 const tempFilePath = `${RNFS.TemporaryDirectoryPath}/qrcode.png`; try { // 将base64数据写入临时文件(注意无需添加data:image/png;base64,前缀) await RNFS.writeFile(tempFilePath, media, 'base64'); const shareOptions = { url: `file://${tempFilePath}`, title: title, message: 'App', type: 'image/png' // 指定文件类型,帮助分享目标正确解析 }; const res = await Share.open(shareOptions); console.log(res); // 分享完成后清理临时文件 await RNFS.unlink(tempFilePath); } catch (err) { console.log("分享错误", err); // 出错时也尝试清理临时文件 try { await RNFS.unlink(tempFilePath); } catch (unlinkErr) { console.log("删除临时文件失败", unlinkErr); } } }
方案2:调整权限配置(Android平台)
确保应用拥有文件读写权限,在android/app/src/main/AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
方案3:检查版本兼容性
react-native-share 7.6.6与RN 0.68.1可能存在兼容性问题,可查看官方release notes,升级至适配RN 0.68的稳定版本(如尝试升级到8.x系列中兼容RN 0.68的版本),或降级至经过验证的稳定版本。
内容的提问来源于stack exchange,提问作者user3487815
相关产品推荐
相关产品推荐

