Android使用Intent的多个电子邮件附件


98

我一直在研究Android程序,使用Intent和来发送带有附件(图像文件,音频文件等)的电子邮件ACTION_SEND。当电子邮件具有单个附件时,该程序正在运行。我曾经Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)将指定的图像文件附加到邮件上,并且工作正常,可以通过Gmail传递邮件。但是,当我试图通过Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)多次调用将多个图像附加到同一封邮件时,它无法工作。电子邮件中都没有附件。

我搜索了有关电子邮件附件的SDK文档和Android编程用户组,但是找不到任何相关信息。但是,我发现还有另一个意图常量ACTION_SEND_MULTIPLE(自API级别4起可用)可以满足我的要求。根据SDK文档,它只是声明将多个数据传递给其他人,其工作方式类似于ACTION_SEND,只是数据是多个。但是我仍然不知道该命令的正确用法。我试图用声明意图ACTION_SEND_MULTIPLE,然后putExtra(EXTRA_STREAM, uri)多次调用以附加多个图像,但是像以前一样,我得到了相同的错误结果,电子邮件中都没有附件。

有没有人尝试过ACTION_SEND_MULTIPLE并使其与多个电子邮件附件一起使用?


我也有同样的问题。它不是工作代码。发送彩信时存在相同的问题,有可能仅添加一个文件。您是否有其他想法?

Answers:


187

这是创建包含多个附件的emailIntent所需的代码。

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
您忘记了主题和emailText的意图。否则,感谢您的代码。
2011年

5
正确的MIME数据类型应为“文本/纯文本”,而不是“普通/文本”:emailIntent.setType("text/plain");。如果您使用“纯文本/文本”,Android将强制使用GMail作为发件人,但是如果您使用“纯文本/文本”,它将提供Gmail,Facebook,蓝牙等应用程序选择器对话框。如果您仅建议邮件程序请改用“ text / xml”。
Idolon 2011年

4
并且,如果将最后一行更改context.startActivity(emailIntent);为复选框,则“应用程序默认使用此操作”将出现在应用程序选择器对话框中,因此用户将能够选择默认应用程序来发送带有多个附件的电子邮件。
Idolon

2
此示例使我知道“ AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?” 我尝试将应用程序上下文和基本上下文传递到此电子邮件方法,并且两者都导致相同的错误。
ravemir

为我解决了这个问题,但是我不确定我是否以一种怪异的方式转义了一个错误,因此对于那些对此有任何想法的人,我将在这里保留先前的评论。
拉韦米尔

29

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);

这对我有用。


19

虽然这是一个旧线程,但是正如它在google搜索上显示的那样,我想添加一个小提示以使其完成,因此我对此感到困惑。

必须使附件文件对于邮件活动具有可读性,否则将不附加附件。所以你必须打电话给某个地方

fileIn.setReadable(true, false)

先生,谢谢您,邮件无法仅发送附件。
Josejulio 2014年

谢谢你,兄弟!没有这一行,我无法发送图片
konunger 2014年

哇!这个答案完全拯救了我。如果有人从gmail应用程序中收到“未附加一个或多个文件。限制为20mb”错误,此修复程序将解决所有问题。有史以来最好的提示!
belphegor '16


2

对于多个附件,请使用PutParcelableArrayListExtra(Intent.ExtraStream, uris)uris variable是“ A 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..."));

希望这可以帮助 ;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.