android - 如何选择带有 ACTION_SENDTO 的电子邮件应用程序也支持附件?

标签 android email android-intent attachment

现在我正在使用 ACTION_SEND 但是有太多应用程序弹出窗口可供选择所以我想使用 ACTION_SENDTO,但我还需要将一些文件(.zip 或图像)附加到电子邮件正文以进行发送,我检查了几乎所有这个网站的评论,几乎没有帮助,任何人都可以帮助我吗?

最佳答案

这个回答有点晚了,但希望能帮助到和楼主有同样问题的人。

以下解决方案将解决 OP 的两个请求(1) 有选择地显示用户可以从中选择的应用 和 (2) 将多个文件附加到电子邮件正文 .

首先,我们将解决#(2)。这是对 Ravi Rupareliya 已发布的解决方案的扩展。假设我们需要附加两个名为“file01”和“file02”的文件。我们会这样做:

ArrayList<Uri> uriList = new ArrayList<Uri>();
Uri uri = Uri.fromFile(new File("file01"));
uriList.add(uri);
Uri uri02 = Uri.fromFile(new File("file02"));
uriList.add(uri02);

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
emailIntent.setType("message/rfc822");
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, *"email title"*);
emailIntent.putExtra(Intent.EXTRA_TEXT, *"email body"*);

创建 Intent 时,使用 ACTION_SEND_MULTIPLE(而不是简单的 ACTION_SEND)表示您希望将多个文件附加到电子邮件中。此外,使用 Content-Type“message/rfc822”表示正文包含使用 RFC 822 标准格式化的封装消息(即您的“file01”和“file02”附件)。

其次,我们将处理#(1)。我建议您在设置模块中提供一个选项,允许用户从电子邮件应用程序列表中选择一个电子邮件客户端。选定的电子邮件客户端将是默认电子邮件,每当用户需要发送电子邮件时都会启动。此提议要求用户从电子邮件应用程序列表中选择仅一次,而不是每次发送电子邮件时。

可以通过以下方式获取此电子邮件应用程序列表:

Intent queryIntent = new Intent(ACTION_SENDTO);
queryIntent.setData(Uri.parse("mailto:"));
queryIntent.setType("message/rfc822");
List intentList = new ArrayList();
PackageManager packageManager = getPackageManager();
List resolveInfoList = packageManager.queryIntentActivities(queryIntent, 0);

for (int i = 0; i < resolveInfoList.size(); i++) {
    ResolveInfo resolveInfo = (ResolveInfo) resolveInfoList.get(i);
    String packageName = resolveInfo.activityInfo.packageName;
    intentList.add(packageName);
}

获取列表后,创建一个模块让您的用户选择电子邮件应用程序(以及 packageName)。

接下来,对于上面#(1) 中的附件代码,我们只需添加以下行:emailIntent.setPackage(selectedPackageName);其中 selectedPackageName(字符串)是用户选择的电子邮件应用程序。

完整的电子邮件附件代码如下所示:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
emailIntent.setType("message/rfc822");
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, *"email title"*);
emailIntent.putExtra(Intent.EXTRA_TEXT, *"email body"*);
emailIntent.setPackage(selectedPackageName);

关于android - 如何选择带有 ACTION_SENDTO 的电子邮件应用程序也支持附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33098280/

相关文章:

java - zxing onActivityResults 未触发

android - 使用 Android 应用程序创建可通过电子邮件发送或可打印的文档

android - 在 RecyclerView 的适配器中获取上下文

android - 访问动态文本字段值android

Python email.header.decode_header 对多行标题失败

javascript - 如何使用正则表达式在 javascript 中针对 php 电子邮件注入(inject)验证电子邮件地址?

android - 如何从自定义 ListView 适配器传递 Intent Extra?

Android请求窗口功能

android - 使用 paypal 选项在 android 中销售电子书?

linux - 通过电子邮件正文中的日志获取 cronjob 脚本执行的日志