Android 12系统中无法从应用缓存目录向Gmail添加附件问题咨询
问题根因
- 代码未使用已配置的FileProvider,直接使用
Uri.fromFile()生成file://类型的URI,Android 7.0及以上系统禁止跨应用传递file://URI,你添加的FLAG_GRANT_READ_URI_PERMISSION仅对content://类型的URI生效,Gmail拿到file://URI也没有权限读取你应用私有目录下的文件。 - 手动在Gmail里选不到私有目录文件是系统限制:Android 10及以上启用分区存储后,第三方应用无法直接访问其他应用的
/Android/data/私有目录,即使用户手动导航也无法查看该目录下的内容,属于系统正常权限限制。
解决步骤
步骤1:在AndroidManifest.xml中注册FileProvider
确认你已经在Manifest的<application>标签下添加了Provider注册,代码如下:
<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_provider" /> </provider>
这里的${applicationId}会自动替换为你的应用包名,要保证和后续生成URI时用的authorities一致。
步骤2:修改sendEmail方法,用FileProvider生成URI
替换掉原来的Uri.fromFile逻辑,同时修正原代码的语法错误,修改后的代码如下:
protected void sendEmail(Context ctx, String filePath){ Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType("application/pdf"); // 生成content://类型的URI File file = new File(filePath); Uri uri = FileProvider.getUriForFile(ctx, ctx.getPackageName() + ".fileprovider", file); // 给接收方授予临时读取权限 emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); emailIntent.putExtra(Intent.EXTRA_STREAM, uri); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "PDF"); // 用Intent.createChooser包裹,避免默认应用选择异常 ctx.startActivity(Intent.createChooser(emailIntent, "发送邮件")); }
额外注意事项
- 确认传入的
filePath确实是当前应用的私有缓存目录路径,不要硬编码路径,推荐通过context.getCacheDir()获取缓存目录根路径拼接生成文件路径,避免不同设备路径不一致的问题。 - 不需要手动修改文件的读写权限,FileProvider会自动处理跨应用的文件访问授权。
- 如果需要兼容Android 7.0以下的旧系统,可以加版本判断,API等级低于24的版本继续用
Uri.fromFile即可。
内容的提问来源于stack exchange,提问作者Gopi krishnan cs
相关产品推荐
相关产品推荐

