Android 11下react-native-mail添加附件致APP崩溃问题求助
问题解决:react-native-mail在Android 11下无法访问缓存文件
问题根源
Android 11(API 30)收紧了应用私有存储的访问权限,你的应用缓存目录属于私有目录,邮件应用无法直接读取该路径下的文件,因此抛出"Failed to find configured root"错误。
方案一:改用公共外部存储目录(最简单)
将PDF文件写入公共的Downloads目录,该目录允许其他应用访问:
- 修改文件路径定义:
// 替换CacheDir为DownloadDir const path = RNFetchBlob.fs.dirs.DownloadDir + '/' + SHA1(this.fileSource.uri) + '.pdf'
- 确保应用拥有外部存储权限,在
android/app/src/main/AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
方案二:配置FileProvider共享私有缓存文件
如果必须使用应用缓存目录,需通过FileProvider授权邮件应用访问该文件:
- 修改AndroidManifest.xml
在<application>标签内添加FileProvider配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
- 创建路径配置文件
在android/app/src/main/res/xml/目录下新建file_paths.xml(若xml目录不存在则手动创建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths> <!-- 授权共享整个缓存目录 --> <cache-path name="cache_files" path="." /> </paths>
- 生成Content URI并修改邮件调用代码
将绝对文件路径转换为FileProvider的Content URI,替换原路径传入Mailer:
import { NativeModules } from 'react-native'; // 动态获取应用包名 const packageName = await NativeModules.PackageInfo.getPackageName(); // 构建Content URI const contentUri = `content://${packageName}.fileprovider/cache_files/${SHA1(this.fileSource.uri)}.pdf`; // 修改Mailer调用的attachment配置 Mailer.mail({ subject: "Subject", body: "", recipients: [this.props.emailAddress], attachment: { path: contentUri, type: 'application/pdf', name: `attachment.pdf`, } }, (error) => { // 错误处理 });
注意:需确认你使用的
react-native-mail分支支持Content URI作为附件路径,若不支持,需修改该库的Android原生代码,适配Content URI的文件读取逻辑。
内容的提问来源于stack exchange,提问作者gkeenley
相关产品推荐
相关产品推荐

