7

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

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 中。如何让附件显示?

4

4 回答 4

2

这似乎适用于我的 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));
于 2013-07-17T14:43:44.703 回答
2

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

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

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

通常使用附件的唯一解决方案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>
于 2015-07-08T13:34:07.633 回答
0

这种方式对我有用:

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
    }
}
于 2012-10-05T07:58:01.423 回答
0

这种方式对我有用:

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();
  }
于 2015-09-26T11:15:42.730 回答