【问题标题】:E-mail attachment through intent using `mailto:` scheme使用 `mailto:` 方案通过意图发送电子邮件附件
【发布时间】:2012-10-05 07:49:56
【问题描述】:

我正在使用此代码附加文件:

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SENDTO);
String uriText;
Uri file = Uri.fromFile(new File(path));
uriText = "mailto:" + 
              "?subject=the subject" + 
              "&body=the body of the message"+
              "&attachment="+file;
uriText = uriText.replace(" ", "%20");
Uri uri = Uri.parse(uriText);
emailIntent.setData(uri);
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

(请注意,path 类似于“/sdcard/test.jpg”,我使用了ACTION_SENDTO,因为我只想在选择器中查看电子邮件应用程序。)

意图将提供电子邮件应用程序列表,但附件不会出现在电子邮件或 Gmail 中。如何让附件显示?

【问题讨论】:

  • 这里有同样的东西。找不到使用 ACTION_SENDTO 将文件附加到电子邮件的方法。使用 ACTION_SEND 可以处理附件,但会显示大量废话。
  • 您应该使用 Uri.Builder() 来创建该 uriText
  • 花了几天时间解决这个问题...现在有更新吗?

标签: android email gmail


【解决方案1】:

这似乎适用于我的 Galaxy Nexus 和 Nexus 4(都运行股票 JellyBean API 17)。

具体来说:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "email@me.com", null));
intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(attachmentFile));
startActivity(Intent.createChooser(intent, "Send email..."));

这不适用于我的 Nexus One (Gingerbread API 10) 或更旧的设备。我不确定它是从什么时候开始工作的。

也许其他人对此有更多详细信息?

当 ACTION_SENDTO 不合适时:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("vnd.android.cursor.dir/email");
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "email@me.com" });
intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(attachmentFile));

【讨论】:

  • 我怀疑它是否已在平台中修复,很可能该 API 级别的 Gmail 应用程序确实允许此意图。对于平台来说,这只是一个意图。
  • 好点。更新了我的答案。可能需要查询意图过滤器才能确定。
  • mime 类型也不对。您实际上并没有发送“vnd.android.cursor.dir/email”作为内容。这就是为什么 VIEW 与适当的额外内容相结合是有意义的:“显示这个 url (mailto:) 并且这里有一些额外的数据”。但真正支持它取决于应用程序。
  • 多年来我一直在使用这种 mime 类型,没有任何问题。不过,我肯定会对听到替代方案感兴趣。对我来说,SENDTO 比 VIEW 更直观,但我很乐意选择最有效的方法,当然。目前,我没有理由相信 VIEW 比 SENDTO 更有效。
【解决方案2】:

意图将提供电子邮件应用程序列表,但 附件不会出现在电子邮件或 Gmail 中。我怎样才能得到 要显示的附件?

多年来,我一直在寻求解决这个问题的方法,为什么在某些设备或 Android 版本或邮件应用程序上,Intent.ACTION_SENDTO 似乎适合通过putExtra(Intent.EXTRA_STREAM,Uri.fromFile(...)) 传输附件信息,而在其他设备上却不适合。

答案很简单:这取决于相应邮件应用的 Manifest。大多数邮件应用在android.intent.action.SENDTO 的意图过滤器中没有android:mimeType

使Intent.ACTION_SENDTO 通常与附件一起工作的唯一解决方案是告诉所有邮件应用程序的制造商他们应该像这样扩展他们的清单(和相应的代码):

<intent-filter>
    <action android:name="android.intent.action.SENDTO" />
    <data android:scheme="mailto" />
    <data android:mimeType="text/plain" />
    <data android:mimeType="image/*" />
    <data android:mimeType="video/*" />
    ...
</intent-filter>

【讨论】:

    【解决方案3】:

    这种方式适合我:

    public static void sendEmailWithImages(Context context, String emailTo, String emailCC, String subject, String emailText, String type, List<String> filePaths) {
        //need to "send multiple" to get more than one attachment
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
        emailIntent.setType(type);
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{emailTo});
        emailIntent.putExtra(android.content.Intent.EXTRA_CC, new String[]{emailCC});
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, emailText);
        //has to be an ArrayList
        ArrayList<Uri> uris = new ArrayList<Uri>();
        //convert from paths to Android friendly Parcelable Uri's
        if(filePaths != null) {
            for (String file : filePaths) {
                File fileIn = new File(file);
                Uri u = Uri.fromFile(fileIn);
                uris.add(u);
            }
            emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
        }
        try {
            context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.send_email_using_message)));
        }catch (ActivityNotFoundException e) {
            //TODO
        }
    }
    

    【讨论】:

    • 在列表选择器中它只会显示电子邮件、gmail 或显示所有像短信、蓝牙等...?thx
    • 用android.content.Intent.ACTION_SENDTO试试上面的方法,应该可以了
    • 关于类型应该放什么? text/plain or message/rfrc822
    • 意图并不特定于发送电子邮件。您基本上是在要求 Android 提供支持发送文件的应用程序列表,其中可能包括从 Dropbox 到 Skype 的任何内容。 OP 在为由 URI 组成的意图指定 mailto 方案时特别询问如何提供附件。
    【解决方案4】:

    这种方式适合我:

    PackageManager pm = getPackageManager();
      Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
      List<ResolveInfo> pkgAppsList = pm.queryIntentActivities(emailIntent, PackageManager.GET_RESOLVED_FILTER);
      List<LabeledIntent> intentList = new ArrayList<>();
      for(ResolveInfo resolveInfo : pkgAppsList){
        String packageName = resolveInfo.activityInfo.packageName;
        Intent intent = new Intent();
        intent.setPackage(packageName);
        intent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
        intent.setAction(Intent.ACTION_SEND);
        intent.setType("message/rfc822");
        intent.putExtra(Intent.EXTRA_EMAIL, new String[]{});
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        intent.putExtra(Intent.EXTRA_TEXT, "");
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intentList.add(new LabeledIntent(intent, packageName, resolveInfo.loadLabel(pm), resolveInfo.icon));
      }
    
      try {
        Intent chooser = Intent.createChooser(intentList.remove(intentList.size() - 1), "Отправка билета на почту");
        LabeledIntent[] extraIntents = intentList.toArray(new LabeledIntent[intentList.size()]);
        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
        startActivity(chooser);
      } catch (Exception ex) {
        Toast.makeText(TicketsActivity.this, "У Вас не установлен почтовый клиент.", Toast.LENGTH_SHORT).show();
      }
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 2015-10-23
      • 2013-12-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多