繁体   English   中英

代号一 Android sendMessage HTML

[英]Codename One Android sendMessage HTML

我的应用程序编译并发送带有以下代码的 HTML 消息:

String s = ...; // html text with normal & bold face, proportional & monospaced fonts, etc.
Message msg = new Message(s);
msg.setMimeType(Message.MIME_HTML);
sendMessage(subject, msg, recipients);

在 iOS (iPhone X) 上,这个工作正常,邮件应用程序打开时正确的 html 呈现文本。

在 Android(三星 Tab A)上这不起作用:

  • Gmail 应用程序:显示带有换行符的纯文本(无粗体等)
  • Email 应用程序(三星):没有换行符的纯文本(dito)

(在带有 email 客户端的模拟器中,我看到了正确的 html 源文本。)

如何解决?

也许这与https://github.com/codenameone/CodenameOne/issues/3101有关。

编辑

使用以下 HTML 示例进行测试:

<!DOCTYPE html>
<html>
<body>
<h2>Example</h2>
Text with <b>bold</b> and <i>italics</i>.<br>
This text on a new line.
</body>
</html>

使用以下 output (读取已发送邮件的屏幕截图):

输出

顺便说一句,当发送纯文本而不是 HTML 时,换行符不会出现在 Gmail 中,而在三星 Email 中会出现(参见问题 3101)。

这些年来,情况似乎发生了很大变化。 Html.fromHtml对于Build.VERSION.SDK_INT >= 24已弃用。 它现在需要一个额外的标志参数Html.FROM_HTML_MODE_LEGACY 但是,旧版本仍然受支持,并且确实如此。 还有一个版本HtmlCompat.fromHtml ,它是等效的。 Class Html 支持 HTML 子集,例如<b><i><font>支持,但不支持<html><body>

接下来,发送 html 消息的推荐方式已更改。 我们应该使用类型"text/plain" ,而不是使用类型"text/html" ,参数EXTRA_TEXT和方法fromHtml ,使用参数EXTRA_TEXT (见下文)提供纯文本,使用参数EXTRA_HTML_TEXT提供原始 HTML 源文本 Email 客户端支持(完整) HTML 将使用EXTRA_HTML_TEXT , Email 客户端不回EXTRA_TEXT

然后,谷歌似乎在几年前删除了 HTML 对 Gmail 的支持为什么?? )。 使用上述方法,Gmail 回EXTRA_TEXT ,而三星 Email支持EXTRA_HTML_TEXT正确呈现 HTML!

Gmail 中发生的情况是 HTML 输入被“清理”,这似乎意味着只有纯文本出现,并且<h1><br>等有适当的换行符。没有其他格式,如粗体,斜体或 Z980D14C0C8346ZE支持的。 Html.fromHtml方法仍可用于为 Gmail 创建EXTRA_TEXT后备文本。

我使用 Android 的本机代码尝试了很多事情,但我无法让 Gmail 正确渲染 HTML。 我找到了几种不同的方法让它在三星 Email 中工作; 我将介绍我认为应该如何做的一个。

结论

下面的代码是问题https://github.com/codenameone/CodenameOne/issues/3101https://github.com/codenameone/CodenameOne/issues/3386的解决方法。

如果您想发送 HTML 格式的文本,这将在某些电子邮件客户端(例如三星电子邮件)中起作用,而在其他电子邮件客户端(尤其是 Gmail)中不起作用。 在后一种情况下,您必须满足于仅发送带有一些换行格式的纯文本。

如果您想发送包含带有换行符的纯文本的邮件,请生成一个仅包含文本和<br>标签的字符串,并使用以下代码将其作为 HTML 发送。 这在三星 Email 和 Gmail 中给出了正确的结果。

package com.xx.yy;

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.text.Html;

import com.codename1.impl.android.AndroidNativeUtil;
import com.codename1.impl.android.IntentResultListener;
import com.codename1.io.Log;

public class AndroidNativeInterfaceImpl {

    // adapted from com.codename1.impl.android.AndroidImplementation.sendMessage()
    // pass HTML String, not Message; no attachments
    public void sendHTMLMessage(String recipient, String subject, String msg) {

        String[] recipients = new String[] { recipient };

        Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_EMAIL, recipients);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);

        // deprecated
        //emailIntent.setType("text/html");
        //emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg));

        // new
        emailIntent.setType("text/plain");
        emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg, Html.FROM_HTML_MODE_LEGACY)); // fallback text for e.g. Gmail
        emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, msg); // raw (full) HTML for e.g. Samsung Email

        AndroidNativeUtil.startActivityForResult(Intent.createChooser(emailIntent, "Send mail..."), new IntentResultListener() {
            public void onActivityResult (int requestCode, int resultCode, Intent data) {
                Log.p("native sendHTMLMessage done");
            }
        });
    }

    public boolean isSupported() {
        return true;
    }
}

编辑:一些有用的链接

https://developer.android.com/reference/android/content/Intent.html#ACTION_SEND

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/text/Html.java

Android - 发送带有样式 HTML 的 email

Android 的 Gmail 应用程序是否删除了通过 Intent 发送 HTML 电子邮件的功能?

使用 android 意图发送基于 HTML 的 email 主体

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM