打开包含多个附件的电子邮件,同时将选择器限制为仅限电子邮件应用程序?

时间:2014-03-07 02:00:15

标签: android email android-intent

Android上发送包含多个附件的电子邮件的最佳方法是什么,而选择器中没有非电子邮件应用

发送电子邮件时,我曾经这样做过:

final Intent sendEmailIntent = new Intent(Intent.ACTION_SEND);
sendEmailIntent.setType("message/rfc822");
sendEmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "test@test.com" });
...

不幸的是," message / rfc822"不再适用于从选择器中过滤掉不需要的应用程序,例如Evernote,Drive和其他各种应用程序。

我最近发现这种解决方法适用于单个附件:

sendEmailIntent = new Intent(Intent.ACTION_SENDTO);
Uri data = Uri.parse("mailto:?to=test@test.com&subject...");
sendEmailIntent.setData(data);  
...

不幸的是,这对多个附件不起作用。我试过了,它崩溃了Gmail。 :S

1 个答案:

答案 0 :(得分:2)

我终于找到了一个解决方案,尽管只适用于Ice Cream Sandwich MR1及以上版本。诀窍是首先使用ACTION_SEND_MULTIPLE构建您的意图:

sendEmailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendEmailIntent.setType("message/rfc822");
sendEmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "some@email.com" });                
sendEmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
sendEmailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
final ArrayList<Uri> uris = /* ... Your code to build the attachments. */
sendEmailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

要将其限制为仅限电子邮件应用,请添加以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    sendEmailIntent.setType(null); // If we're using a selector, then clear the type to null. I don't know why this is needed, but it doesn't work without it.
    final Intent restrictIntent = new Intent(Intent.ACTION_SENDTO);
    Uri data = Uri.parse("mailto:?to=some@email.com");
    restrictIntent.setData(data);
    sendEmailIntent.setSelector(restrictIntent);
}

当您使用startActivity()触发此意图时,您现在只会在列表中看到电子邮件应用,如果您选择Gmail,则会有多个附件。

我使用try / catch执行此操作以防startActivity解析为无活动,在这种情况下我删除了选择器,它似乎运行良好。