官方文档展示了如何发送带有附件的电子邮件:
public void composeEmail(String[] addresses, String subject, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
然后说:
如果您想确保您的意图仅由电子邮件应用程序(而不是其他短信或社交应用程序)处理,请使用
操作并包含ACTION_SENDTO
数据方案。
"mailto:"
像这样:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
但实际上,我想要上述的组合......即仅使用电子邮件应用程序发送带有附件的电子邮件和。
但是当将
intent.setData(Uri.parse("mailto:"))
与 Intent.ACTION_SEND
或 Intent.ACTION_SEND_MULTIPLE
结合使用时,什么也没有发生...根本没有电子邮件应用程序(或应用程序选择器)打开。
那么如何发送带有附件(或多个附件)的电子邮件,同时将应用程序限制为电子邮件应用程序?
该
mailto:
URI 字符串在没有收件人的情况下显得无效;尝试类似的方法:
intent.setData(Uri.parse("mailto:" + String.join(",", addresses)));
参见 RFC 6068:“mailto”URI 方案。
删除
if (intent.resolveActivity(getPackageManager()) != null)
检查,它将打开意图。通常,无论电子邮件处理应用程序是否存在,操作系统都会返回 null。
您可以通过
PackageManager#queryIntentActivities
使用 ACTION_SENDTO
和“mailto:”操作查询意图,然后构建新的选择器意图,并设置 EXTRA_INITIAL_INTENTS
来发送带有附件的电子邮件,并且仅发送电子邮件应用程序。
这是示例代码:
fun sendEmail(context: Context, email: String, subject: String, body: String, uri: Uri?) {
val intent = Intent(Intent.ACTION_SEND)
intent.setType("vnd.android.cursor.dir/email")
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, body)
if (uri != null) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.putExtra(Intent.EXTRA_STREAM, uri)
}
val emailAppMatchIntent = Intent(Intent.ACTION_SENDTO)
emailAppMatchIntent.setData(Uri.parse("mailto:"))
val chooser = Intent.createChooser(emailAppMatchIntent, "Send email")
val emailActivityInfo = context.packageManager
.queryIntentActivities(emailAppMatchIntent, MATCH_ALL)
.map { it.activityInfo.packageName }
.toTypedArray()
val intents = emailActivityInfo.map { Intent(intent).setPackage(it) }
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toTypedArray())
context.startActivity(chooser)
}
您应该将这些配置添加到您的 AndroidManifest 中:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<queries>
<intent>
<action android:name="android.intent.action.SENDTO" />
<data android:scheme="mailto" />
</intent>
<intent>
<action android:name="android.intent.action.SEND" />
</intent>
</queries>