【问题标题】:Email intent ignoring line-breaks in preset text (Android)电子邮件意图忽略预设文本中的换行符(Android)
【发布时间】:2012-03-14 22:35:14
【问题描述】:

在各种 Android 应用程序中,我使用以下代码显示电子邮件的应用程序选择器,并在用户决定选择其中一个应用程序后,在电子邮件表单中插入预定义文本:

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "info@example.org" });
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample subject");
String contentStr = "";
for (Object o : mArrayList) { // mArrayList: ArrayList<Object>
    content = contentStr+o.toString()+"\n";
}
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr);
startActivity(Intent.createChooser(emailIntent, "Choose application"));

在 for 循环中,对象的字符串输出与临时字符串“contentStr”连接。在每个对象之后,应该有一个换行符(“\n”)。

所以当我在手机上测试这段代码时,它运行良好,每个对象都有自己的行。

但用户报告说他们的电子邮件应用程序(Android 标准也是如此)将所有内容放在一行中并忽略换行符。

那么我做错了吗?或者我可以忽略这个错误报告,因为它不是开发人员可以解决的问题吗?

【问题讨论】:

  • 你可以试试text/plain 而不是plain/text。此外,您应该使用 StringBuilder 而不是进行所有这些连接。不过,我怀疑这两种方法都有助于解决您的问题。
  • 谢谢!但请参阅下面的我的 cmets,了解“text/plain”的缺点。
  • 正如 Marco W. 指出的,“message/rfc822”是电子邮件的正确 mime 类型

标签: android email android-intent


【解决方案1】:

2 条潜在线索:

  • 尝试使用 \r 或 \n\r 而不是简单的 \n,甚至 2 个换行符。
  • 使用 HTML 格式的换行符 (&lt;br&gt;)

另外,这里的代码有问题

String contentStr = "";
for (Object o : mArrayList) { // mArrayList: ArrayList<Object>
    content = contentStr+o.toString()+"\n";
}
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr);

这并没有在intent中放任何东西,contentStr为空,content只包含最后一个对象。

这是一种更好、更短、更高效的方法:

contentStr = TextUtils.join("\n", mArrayList);

【讨论】:

  • 非常感谢您选择TextUtils.join()。我使用 '\n' 因为这是针对 Linux(和其他),而 \r\n 是针对 Windows(和其他),不是吗?维基百科建议在 Java 中使用 System.getProperty("line.separator") 换行。这是一个好的解决方案吗?
  • 我认为是。这应该会给你你所在的系统使用的行分隔符。但是,android 是基于 linux 的,所以它应该总是\n。您是否能够重现该问题?
【解决方案2】:

您需要将\n 替换为&lt;br/&gt;,即使您输入了EXTRA_TEXT。有我的代码:

final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, "xxx@xxx.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "This\nis\na\ntest!".replace("\n", "<br/>"););

【讨论】:

    【解决方案3】:

    使用:

    emailIntent.setType("text/plain");
    

    ACTION_SEND

    final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "info@example.org" });
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample subject");
    String contentStr = "";
    for (Object o : mArrayList) { // mArrayList: ArrayList<Object>
        content = contentStr+o.toString()+"\n";
    }
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr);
    startActivity(Intent.createChooser(emailIntent, "Choose application"));
    

    【讨论】:

    • 谢谢!当我使用“text/plain”时,应用程序选择器会显示所有可以处理文本消息的应用程序(例如 SMS、Facebook)。但是当我使用旧的“纯文本”时,只会显示电子邮件应用程序。为什么会这样?我只想要电子邮件应用程序。
    • @MarcoW.: plain/text 不仅为您提供电子邮件应用程序。它将为您提供用户已安装的处理无效 MIME 类型的任何内容。如果您想限制电子邮件,请使用ACTION_SENDTOmailto: Uri
    • 谢谢! “ACTION_SENDTO”对我不起作用。但我发现使用“message/rfc822”作为 MIME 类型会有所帮助。这适合发送电子邮件吗?
    • 不过,这个问题的真正问题还没有解决。
    【解决方案4】:

    在对各种方法和场景进行了几个小时的测试后,这是我在 2020 年仍然有效的答案。我使用 Gmail、Outlook 和三星的邮件应用程序对其进行了测试:

    public static void composeEmail(@NonNull Activity activity,
                                        @NonNull String address,
                                        @Nullable String subject,
                                        @Nullable String body) {
            Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
            emailIntent.setData(Uri.parse("mailto:"));
            emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {address});
            emailIntent.putExtra(Intent.EXTRA_TEXT, body);
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
            activity.startActivity(Intent.createChooser(emailIntent, activity.getString(R.string.choose_email_client)));
        }
    

    您使用\n 作为正文中的换行符,它可以正常工作。请注意,如果您将\n 与 HTML 标记 (&lt;br/&gt;) 混合使用,Outlook 将假定电子邮件正文为 html 格式并忽略非 html 换行符 (\n)!

    我的方法只在应用选择器列表中显示电子邮件客户端,就像它应该的那样。

    此外,您还可以使用“美化”电子邮件地址,例如 John Doe &lt;john.doe@example.com&gt;

    【讨论】:

      【解决方案5】:

      我使用类似以下的方法来确保不会在其中获取 SMS/Twitter/Facebook 应用程序:

      Intent emailIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:someemail@gmail.com"));
                      emailIntent.setType("text/plain");
                      emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"someemail@gmail.com"});
                      emailIntent.putExtra(Intent.EXTRA_TEXT, msg );
                      emailIntent.putExtra(Intent.EXTRA_SUBJECT, "This is my Error Report");
      

      这里的String msg 是使用StringBuilder 制作的,并包含\n 用于换行。 基本上,我认为您只需要更改您的 MIME 类型就可以了。

      【讨论】:

      • 非常感谢! StringBuilder 是一个很好的提示。请参阅我对 Jorgesys 回答的评论。甚至你的额外 Uri.parse() 也不起作用:(
      • 此解决方案仍然在选择器列表中显示大量非电子邮件应用程序。
      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多