这些年来,情况似乎发生了很大变化。
Html.fromHtml 已被 Build.VERSION.SDK_INT >= 24 弃用。
它现在需要一个额外的标志参数Html.FROM_HTML_MODE_LEGACY。
但是,旧版本仍然受支持,并且确实如此。
还有一个版本HtmlCompat.fromHtml,是等价的。
Html 类支持 HTML 子集,例如支持<b>、<i> 和<font>,但不支持<html> 和<body>。
接下来,发送 html 消息的推荐方式已更改。
而不是使用类型"text/html",参数EXTRA_TEXT和方法fromHtml,
我们应该使用"text/plain" 类型,使用参数EXTRA_TEXT 提供纯文本(见下文)
和使用参数EXTRA_HTML_TEXT 提供原始 HTML 源文本。
支持(完整)HTML 的电子邮件客户端将使用EXTRA_HTML_TEXT,不回退到EXTRA_TEXT 的电子邮件客户端。
然后,似乎 Google 几年前已经删除了对 Gmail 的 HTML 支持(为什么??)。
使用上述方法,Gmail 回退到 EXTRA_TEXT,而 Samsung Email 支持 EXTRA_HTML_TEXT 并提供 正确呈现的 HTML!
在 Gmail 中发生的情况是 HTML 输入被“净化”,这似乎意味着只有纯文本出现,
为<h1>、<br> 等添加适当的换行符。不支持其他格式,例如粗体、斜体或字体。
Html.fromHtml 方法对于为 Gmail 创建 EXTRA_TEXT 后备文本仍然很有用。
我尝试了很多使用 Android 原生代码的方法,但我无法让 Gmail 正确呈现 HTML。
我找到了几种不同的方法让它在三星电子邮件中工作;我将介绍我认为应该如何完成的一个。
结论
下面的代码是解决问题的方法
https://github.com/codenameone/CodenameOne/issues/3101 和
https://github.com/codenameone/CodenameOne/issues/3386.
如果您想发送 HTML 格式的文本,这将在某些电子邮件客户端(例如三星电子邮件)中起作用,而在其他电子邮件客户端(最显着的 Gmail)中则不起作用。在后一种情况下,您必须满足于仅发送带有某些换行格式的纯文本。
如果您要发送包含带有换行符的纯文本的邮件,请生成一个仅包含文本和<br> 标记的字符串,并且
使用下面的代码将此作为 HTML 发送。这会在三星电子邮件和 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 - Send email with styled HTML
Has Android's Gmail app removed the ability to send HTML emails via Intent?
Sending HTML based email body using android intent