Android 12 ACTION_SENDTO Intent附加参数异常原因及Java修复方法
异常原因
Android 12对隐式Intent的匹配和参数传递规则做了收紧调整:当直接使用ACTION_SENDTO发起邮件发送请求时,系统仅会传递符合mailto: URI格式规范内的参数,单独通过putExtra()添加的EXTRA_SUBJECT、EXTRA_TEXT、EXTRA_EMAIL等额外参数会被系统过滤,不会传递给最终被调起的邮件客户端,因此编辑界面无法显示对应内容。该规则是Android 12新增的权限/隐私限制逻辑,更低版本的系统无此限制,因此旧代码在老版本运行正常。
Java 修复方案
修复逻辑为使用ACTION_SEND承载所有邮件相关的额外参数,再通过selector指定仅匹配支持mailto:协议的邮件类应用,既可以保证所有参数正常传递,也能避免匹配到社交软件、文件传输工具等非邮件类应用。
示例代码如下:
import android.content.Intent; import android.net.Uri; // 常量可根据业务需求自行定义 private static final String EMAIL = "target@example.com"; private static final String TITLE = "自定义邮件标题"; public Intent createEmailSendIntent(String content) { // 用ACTION_SEND承载所有自定义参数 Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{EMAIL}); sendIntent.putExtra(Intent.EXTRA_SUBJECT, TITLE); sendIntent.putExtra(Intent.EXTRA_TEXT, content); // 配置selector筛选仅支持邮件协议的应用 Intent selector = new Intent(Intent.ACTION_SENDTO); selector.setData(Uri.parse("mailto:")); sendIntent.setSelector(selector); return sendIntent; }
注意事项
- 该方案同时兼容Android 12以上及以下所有系统版本,无需额外做版本分支判断
- 不要使用设置
type = "message/rfc822"的方式筛选邮件应用,该方式匹配精度低,会出现大量非邮件类应用出现在选择列表中
内容的提问来源于stack exchange,提问作者AndreaF
相关产品推荐
相关产品推荐

