Android ACTION_SEND Intent问题:Gmail发送/存草稿时PDF附件丢失
Android Gmail附件发送丢失问题分析与解决方案
核心问题原因
这是Gmail在处理ACTION_SEND Intent时的已知兼容性问题:当Intent同时设置纯文本内容与PDF附件,且MIME类型指定为application/pdf时,Gmail会优先识别为纯文本邮件,忽略附件的URI读取权限(即使已添加FLAG_GRANT_READ_URI_PERMISSION),最终导致发送时附件丢失并自动转存草稿。
修复方案
方案1:改用邮件专用MIME类型message/rfc822
将Intent的MIME类型改为邮件标准类型,明确告知Gmail这是一封带附件的完整邮件,可解决权限识别冲突:
修改sendEmailWithPdf()方法中的Intent构建代码:
Intent intent = ShareCompat.IntentBuilder.from(this) .setType("message/rfc822") // 替换为邮件专用MIME类型 .setEmailTo(new String[]{RECIPIENT}) .setSubject(SUBJECT) .setText(BODY) .setStream(contentUri) .getIntent(); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setClipData(ClipData.newRawUri("PDF Attachment", contentUri)); startActivity(Intent.createChooser(intent, "Send Email with PDF..."));
方案2:拆分文本与附件的Intent参数传递
若需保留application/pdf的MIME类型,可移除ShareCompat的setText()调用,改用Intent原生EXTRA_TEXT参数传递正文,确保附件权限被正确识别:
Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("application/pdf"); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{RECIPIENT}); intent.putExtra(Intent.EXTRA_SUBJECT, SUBJECT); intent.putExtra(Intent.EXTRA_TEXT, BODY); intent.putExtra(Intent.EXTRA_STREAM, contentUri); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setClipData(ClipData.newRawUri("PDF Attachment", contentUri)); startActivity(Intent.createChooser(intent, "Send Email with PDF..."));
额外验证点
- 确认FileProvider路径配置:你的
file_paths.xml中external-files-path的path为Documents/EmailTests,与代码中getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)下的子目录完全匹配,无需修改。 - 测试其他邮件客户端:若Outlook、三星邮件等客户端可正常发送附件,即可确认问题仅源于Gmail的兼容性逻辑。
补充说明
Gmail的该行为在Android 11+版本中表现更突出,因系统对URI权限的管控更严格,当MIME类型与邮件内容类型不匹配时,会自动回收附件的读取权限。使用message/rfc822是最稳妥的兼容方案,可确保邮件客户端正确解析带附件的完整邮件结构。
内容的提问来源于stack exchange,提问作者PickyBiker
相关产品推荐
相关产品推荐

