Android 仅使用电子邮件应用程序发送带附件的电子邮件

问题描述 投票:0回答:3

官方文档展示了如何发送带有附件的电子邮件:

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
结合使用时,什么也没有发生...根本没有电子邮件应用程序(或应用程序选择器)打开。

那么如何发送带有附件(或多个附件)的电子邮件,同时将应用程序限制为电子邮件应用程序?

java android android-intent mailto
3个回答
0
投票

mailto:
URI 字符串在没有收件人的情况下显得无效;尝试类似的方法:

intent.setData(Uri.parse("mailto:" + String.join(",", addresses)));

参见 RFC 6068:“mailto”URI 方案。


0
投票

删除

if (intent.resolveActivity(getPackageManager()) != null)
检查,它将打开意图。通常,无论电子邮件处理应用程序是否存在,操作系统都会返回 null。


0
投票

您可以通过

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>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.