102

我一直在开发 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并让它与多个电子邮件附件一起工作?

4

5 回答 5

189

这是创建包含多个附件的 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..."));
}
于 2010-07-21T14:45:04.570 回答
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);

这对我有用。

于 2011-01-05T19:50:21.990 回答
20

虽然这是一个旧线程,但正如它在谷歌搜索顶部显示的那样,我想添加一个小提示以使其完整,因此我偶然发现它。

必须使附加的文件对邮件活动可读,否则它们将不会被附加。所以你必须打电话给某个地方

fileIn.setReadable(true, false)
于 2013-02-22T10:42:03.600 回答
19

在这里我找到了很好的例子http://www.blackmoonit.com/2010/02/filebrowser-send-receive-intents/

你必须使用

final Intent aIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
aIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,theUris);
aIntent.setType(theOverallMIMEtype);
于 2010-04-03T21:52:37.497 回答
3

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

希望这可以帮助 ;)

于 2016-09-13T07:09:48.307 回答