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

Posted

技术标签:

【中文标题】使用 Intent 的 Android 多个电子邮件附件【英文标题】:Android multiple email attachments using Intent 【发布时间】:2011-01-16 21:39:40 【问题描述】:

我一直在开发 android 程序,使用带有 ACTION_SEND 的 Intent 发送带有附件(图像文件、音频文件等)的电子邮件。当电子邮件只有一个附件时,该程序正在运行。我使用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 并让它与多个电子邮件附件一起使用?

【问题讨论】:

我也有同样的问题。它不是工作代码。发送彩信时也存在同样的问题,有可能只添加一个文件。你对它有另一种想法吗?? 【参考方案1】:

这是创建包含多个附件的 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..."));

【讨论】:

您忘记将主题和 emailText 放在意图中。否则感谢您的代码。 正确的 MIME 数据类型应该是“text/plain”而不是“plain/text”:emailIntent.setType("text/plain");。如果您使用“plain/text”,Android 将强制使用 GMail 作为发件人,但如果您使用“text/plain”,它将提供 Gmail、Facebook、蓝牙等应用程序选择对话框。如果您只想提出邮件程序改用“text/xml”。 如果您将最后一行更改为context.startActivity(emailIntent); 复选框“默认情况下用于此操作”将出现在应用程序选择器对话框中,因此用户将能够选择用于发送电子邮件的默认应用程序带有多个附件。 这个例子给我带来了一个“AndroidRuntimeException:从 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?”我尝试将 Application 和 base context 都传递给此电子邮件方法,但都导致相同的错误。 This 为我解决了这个问题,但我不确定我是否以一种奇怪的方式逃避了一个错误,所以我会把之前的评论留给任何有任何想法的人它。【参考方案2】:

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

这对我有用。

【讨论】:

【参考方案3】:

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

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

fileIn.setReadable(true, false)

【讨论】:

谢谢先生,邮件无法仅发送邮件附件。 谢谢你,伙计!没有这条线,我无法发送图片 哇!这个答案完全挽救了我的一天。如果有人从 gmail 应用程序收到“一个或多个文件未附加。限制 20mb”错误,此修复程序可以解决所有问题。有史以来最好的提示!【参考方案4】:

在这里我找到了很好的例子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);

【讨论】:

【参考方案5】:

对于多个附件,请使用 PutParcelableArrayListExtra(Intent.ExtraStream, uris)其中 uris 变量是 List&lt;IParcelable&gt;(). 这是一个例子:

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

希望这会有所帮助;)

【讨论】:

以上是关于使用 Intent 的 Android 多个电子邮件附件的主要内容,如果未能解决你的问题,请参考以下文章

HTC Thunderbolt 上的 Android 电子邮件多个附件问题

使用 Android Intent.ACTION_SEND 发送电子邮件

使用 Android Intent.ACTION_SEND 发送电子邮件

使用Intent从Android发送电子邮件

在 Android 中发送电子邮件时在 StartActivity() 中使用 Intent.createChooser() 的目的是啥

Android Intent 选择器仅显示电子邮件选项