Android使用Intent发送多个邮件附件

102

我正在开发一个Android程序,使用Intent的ACTION_SEND来发送带有附件(图像文件、音频文件等)的电子邮件。当电子邮件只有单个附件时,程序可以正常工作。我使用了Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)将指定的图像文件附加到邮件中,一切正常,可以通过Gmail发送邮件。然而,当我试图通过多次调用Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)来附加多张图片到同一封邮件时,它无法正常工作。没有任何附件出现在邮件中。

我搜索了SDK文档和Android编程用户组关于电子邮件附件的相关信息,但是没有找到任何相关信息。然而,我发现还有另一个Intent常量ACTION_SEND_MULTIPLE(自API级别4起可用),可能满足我的要求。根据SDK文档,它仅仅说明它可以向其他人传递多个数据,就像ACTION_SEND一样,不同之处在于数据是多个。但是我仍然无法弄清楚如何正确使用这个命令。我尝试使用ACTION_SEND_MULTIPLE声明意图,然后多次调用putExtra(EXTRA_STREAM, uri)附加多个图像,但是我得到了与之前相同的错误结果,没有任何附件出现在邮件中。

有人尝试过使用ACTION_SEND_MULTIPLE并成功发送多个电子邮件附件吗?


我有同样的问题。代码无法运行。在发送彩信时也存在同样的问题,只能添加一个文件。你有其他解决方法吗? - user500886
5个回答

189

以下是您需要创建包含多个附件的电子邮件意图的代码。

public static void email(Context context, String emailTo, String emailCC,
    String subject, String emailText, List<String> filePaths)
{
    //need to "send multiple" to get more than one attachment
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
        new String[]{emailTo});
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
        new String[]{emailCC});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
    //has to be an ArrayList
    ArrayList<Uri> uris = new ArrayList<Uri>();
    //convert from paths to Android friendly Parcelable Uri's
    for (String file : filePaths)
    {
        File fileIn = new File(file);
        Uri u = Uri.fromFile(fileIn);
        uris.add(u);
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}

2
你忘记将主题和电子邮件文本放入意图中了。不过还是感谢你提供的代码。 - Bahadır Yağan
5
正确的MIME数据类型应该是"text/plain"而不是"plain/text": emailIntent.setType("text/plain");。如果你使用"plain/text",Android将强制使用GMail作为发送者,但如果你使用"text/plain",它将提供应用选择对话框,包括Gmail、Facebook、蓝牙等选项。如果您只想建议邮件程序使用"text/xml"。 - Idolon
4
如果您将最后一行更改为context.startActivity(emailIntent);,则在应用程序选择器对话框中将出现“默认使用此操作”的复选框,因此用户将能够选择用于发送带有多个附件的电子邮件的默认应用程序。 - Idolon
2
这个例子给我带来了一个“AndroidRuntimeException: 从Activity上下文之外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?” 我已经尝试将应用程序和基本上下文都传递给这个电子邮件方法,但两者都导致相同的错误。 - ravemir
当我意识到这是Java时,我才明白你从哪里得到了那个通用的ArrayList...对于那些在C#/Xamarin中进行操作的人来说,它同样有效,只需摆脱驼峰式命名并编写var uris = new List<Android.OS.IParcelable>();即可。 - Cee McSharpface
显示剩余2条评论

31

ACTION_SEND_MULTIPLE 应该是操作行为,

然后是 emailIntent.setType("text/plain");

接着是:

ArrayList<Uri> uris = new ArrayList<Uri>();
String[] filePaths = new String[] {"sdcard/sample.png", "sdcard/sample.png"};
for (String file : filePaths)
{
    File fileIn = new File(file);
    Uri u = Uri.fromFile(fileIn);
    uris.add(u);
}
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(emailIntent);

这对我有用。


20
尽管这是一个旧的帖子,但由于它在谷歌搜索中排名靠前,我想添加一个小提示以使其完整,因此我偶然发现了它。
有必要使附加的文件对邮件活动可读,否则它们将无法被附加。因此,您需要在某个地方调用。
fileIn.setReadable(true, false)

谢谢您,邮件无法发送附件,只有邮件本身。 - Josejulio
谢谢,伙计!如果没有这行代码,我就无法发送图片了。 - konunger
哇!这个答案真的救了我的一天。如果有人从Gmail应用程序收到“一个或多个文件未附加。限制20MB”的错误消息,这个修复程序可以解决所有问题。最好的提示! - belphegor

19

4

如果需要添加多个附件,请使用PutParcelableArrayListExtra(Intent.ExtraStream, uris)函数。其中,uris变量是一个List<IParcelable>()类型的对象。

以下是一个示例:

var email = new Intent(Intent.ActionSendMultiple);
    email.SetType("text/plain");
    email.PutExtra(Intent.ExtraEmail, new string[]{emailTo});
    email.PutExtra(Intent.ExtraCc, new string[]{emailCC});

    var uris = new List<IParcelable>();
    filePaths.ForEach(file=> {
        var fileIn = new File(file);
        var uri = Android.Net.Uri.FromFile(fileIn);
        uris.Add(uri);
    });

    email.PutParcelableArrayListExtra(Intent.ExtraStream, uris);

    context.StartActivity(Intent.CreateChooser(email, "Send mail..."));

希望这可以帮到你;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接