Android 中的 mailto 链接是不是需要进行 URL 编码才能使邮件 Intent 起作用?

Posted

技术标签:

【中文标题】Android 中的 mailto 链接是不是需要进行 URL 编码才能使邮件 Intent 起作用?【英文标题】:Do mailto links in Android need to be URL encoded for mail Intents to work?Android 中的 mailto 链接是否需要进行 URL 编码才能使邮件 Intent 起作用? 【发布时间】:2014-07-11 23:57:09 【问题描述】:

环境:

Windows Server 2012 标准版 android Studio 0.5.8 - android-19 JRE 1.7.0_51

问题描述:

在 Android Web 视图中覆盖 URL 加载以启动电子邮件 Intent 无法识别 mailto 属性。

MailTo.parse("mailto:?subject=Something%20interesting%20from%20Google&body=GooglePlus%20(%20https://google.com/plus%20)")

返回:

关键” 值:“/加号)”

当电子邮件意图由以下人员准备时:

Intent 意图 = new Intent(Intent.ACTION_SENDTO); intent.putExtra(Intent.EXTRA_EMAIL, new String[] address ); 意图.putExtra(意图.EXTRA_TEXT,正文); 意图.putExtra(意图.EXTRA_SUBJECT,主题); 意图.putExtra(意图.EXTRA_CC,cc); 意图.addFlags(意图.FLAG_ACTIVITY_MULTIPLE_TASK); 意图.addFlags(意图.FLAG_ACTIVITY_NEW_TASK); intent.setType("消息/rfc822"); intent.setData(Uri.parse("mailto:")); // 只有电子邮件应用程序应该处理这个 返回意图;

然后:

if (url.startsWith("mailto:")) MailTo mailTo = MailTo.parse(url); Intent intent = newEmailIntent(mailTo.getTo(), mailTo.getSubject(), mailTo.getBody(), mailTo.getCc()); _mainActivity.startActivity(Intent.createChooser(intent, "发送电子邮件...")); 返回真;

如果我删除传输协议中的冒号或将其替换为 %3a,则主题和正文将按预期进行解析。

问题:在标题中^。

提前致谢。

【问题讨论】:

【参考方案1】:

MailTo 似乎在解析 mailto: URL 时出现问题,该 URL 在主题或正文字段中包含出现在 URL 中的字符(例如:和 /)。我在尝试解析在正文字段中包含 Web URL 的 mailto URL 时遇到了这种情况(即,我希望电子邮件正文包含收件人可以单击的链接)。

我为克服这个问题所做的是制作 MailTo 类的修改副本(称为 MailTo2),并将 parse 方法修改为如下:

/**
 * Parse and decode a mailto scheme string.  This parser implements
 * RFC 2368.  The returned object can be queried for the parsed
 * parameters.
 * @param theUrl String containing a mailto URL
 * @return MailTo2 object
 * @exception IllegalArgumentException if the URL scheme is not mailto.
 */
public static MailTo2 parse(String theUrl) 
  throws IllegalArgumentException 

  MailTo2 theMailTo2 = null;
  String  theNoSchemeUrl = null;
  String  theQuery = null;
  Uri     theEmailUri = null;
  int     thePos = 0;

  // Validate the given URL.
  if (theUrl == null) 
  
    throw new NullPointerException();
  
  if (!isMailTo(theUrl)) 
  
    throw new IllegalArgumentException("Not a mailto scheme: " + theUrl);
  

  // Strip the scheme as the URI parser can't cope with it.
  theNoSchemeUrl = theUrl.substring(MAILTO_SCHEME.length());

  // Get the query part of the URL.
  thePos = theNoSchemeUrl.indexOf('?');
  if (thePos >= 0)
  
    theQuery = theNoSchemeUrl.substring(thePos+1);
    theNoSchemeUrl = theNoSchemeUrl.substring(0, thePos);
  

  // Create a URL from the URL string (without scheme and query).
  theEmailUri = Uri.parse(theNoSchemeUrl);

  // Construct the MailTo2 instance which will be returned.
  theMailTo2 = new MailTo2();

  // Parse out the query parameters
  if (theQuery != null) 
  
    String[] theQueryParts = theQuery.split("&");
    String   theName = null;
    String   theValue = null;

    for (String theQueryPart : theQueryParts) 
    
      thePos = theQueryPart.indexOf('=');
      if (thePos <= 0)  continue;
      theName = theQueryPart.substring(0, thePos);
      theValue = theQueryPart.substring(thePos+1).trim();

      // insert the headers with the name in lower-case so that
      // we can easily find common headers
      theMailTo2.HEADERS.put(Uri.decode(theName).toLowerCase(Locale.ROOT),
                             Uri.decode(theValue));
    
  

  // Address can be specified in both the headers and just after the
  // mailto line. Join the two together.
  String address = theEmailUri.getPath();
  if (address != null) 
  
    String addr = theMailTo2.getTo();
    if (addr != null) 
    
      address += ", " + addr;
    
    theMailTo2.HEADERS.put(TO, address);
  

  return theMailTo2;

【讨论】:

以上是关于Android 中的 mailto 链接是不是需要进行 URL 编码才能使邮件 Intent 起作用?的主要内容,如果未能解决你的问题,请参考以下文章

mailto:链接未在 Cordova 应用程序中打开 Android 上的邮件应用程序

mailto

有没有办法从服务人员打开 mailto: 和 tel: 链接?

如何在iOS(safari)中获取mailto链接以打开Outlook应用程序?

你如何创建一个mailto:没有(to)部分的链接

是否可以在 MAILTO 链接的正文中添加 HTML 链接 [重复]