如何仅使用电子邮件应用程序发送电子邮件附件?

有两个要求:

  • 电子邮件附件
  • Intentselect器中,应该只有电子邮件应用程序。

我所知道/所做的:

  • Intent.ACTION_SENDTOintent.setData(Uri.parse("mailto:"))可以确保在Intentselect器中只有电子邮件应用程序,但它不会带来附件(对于一些像Gmail这样的应用程序,但也有很多将忽略附件的应用程序)。

  • Intent.ACTION_SEND可以通过附件发送邮件。 但是,在Intentselect器中,将会有应用程序实际上不是电子邮件应用程序,但可以响应Intent.ACTION_SEND 。 使用intent.setType("message/rfc822")可以减less这些应用程序的数量,但不是全部。

  • 引用这个答案: https : //stackoverflow.com/a/8550043/3952691和几乎成功我的目标。 我的代码如下:

     private static void sendFeedbackWithAttachment(Context context, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0); if (resolveInfos.isEmpty()) { Toast.makeText(context, context.getString(R.string.error_activity_not_found), Toast.LENGTH_SHORT).show(); } else { // ACTION_SEND may be replied by some apps that are not email apps. However, // ACTION_SENDTO doesn't allow us to choose attachment. As a result, we use // an ACTION_SENDTO intent with email data to filter email apps and then send // email with attachment by ACTION_SEND. List<LabeledIntent> intents = new ArrayList<>(); Uri uri = getLatestLogUri(); for (ResolveInfo info : resolveInfos) { Intent i = new Intent(Intent.ACTION_SEND); i.setPackage(info.activityInfo.packageName); i.setClassName(info.activityInfo.packageName, info.activityInfo.name); i.putExtra(Intent.EXTRA_EMAIL, new String[] { Def.Meta.FEEDBACK_EMAIL }); i.putExtra(Intent.EXTRA_SUBJECT, subject); i.putExtra(Intent.EXTRA_STREAM, uri); intents.add(new LabeledIntent(i, info.activityInfo.packageName, info.loadLabel(context.getPackageManager()), info.icon)); } Intent chooser = Intent.createChooser(intents.remove(0), context.getString(R.string.send_feedback_to_developer)); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new LabeledIntent[intents.size()])); context.startActivity(chooser); } } 

    但是,在某些设备上(例如,带有MIUI V5的小米2S,我不知道这是否会受到第三方ROM的影响),结果是一个空的Intentselect器。 而似乎上面的Android 6.0, Intent.EXTRA_INITIAL_INTENTS有一些错误( Custom intent- Intent.EXTRA_INITIAL_INTENTS – 为什么在Android 6上它显示空单元格? ,另一个: https : //code.google.com/p/android/issues / detail?id = 202693 )。

因此,我不知道如何实现我的目标。 请帮助我,提前谢谢你。

Solutions Collecting From Web of "如何仅使用电子邮件应用程序发送电子邮件附件?"

尝试下面的代码来发送邮件

 String filename="filename.vcf"; File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename); Uri path = Uri.fromFile(filelocation); Intent emailIntent = new Intent(Intent.ACTION_SEND); // set the type to 'email' emailIntent .setType("vnd.android.cursor.dir/email"); String to[] = {"asd@gmail.com"}; emailIntent .putExtra(Intent.EXTRA_EMAIL, to); // the attachment emailIntent .putExtra(Intent.EXTRA_STREAM, path); // the mail subject emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject"); startActivity(Intent.createChooser(emailIntent , "Send email...")); 

试试这样更高效:

  String[] TO = {"test@domain.com"}; Uri uri = Uri.parse("mailto:test@domain.com") .buildUpon() .appendQueryParameter("subject", "subject") .appendQueryParameter("body", "body") .build(); Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri); emailIntent.putExtra(Intent.EXTRA_EMAIL, TO); startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

有两种方法可以做到这一点

选项1

  Intent emailIntent = new Intent( android.content.Intent.ACTION_VIEW); //Option 1 Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "sendme@me.com"); emailIntent.setData(data); startActivity(Intent.createChooser(emailIntent, "")); 

结果

在这里输入图像说明

scheme2

它工作不错,除了它不会过滤掉FTP

  //Option 2 emailIntent = new Intent( android.content.Intent.ACTION_SEND); emailIntent.setType("message/rfc822"); final String[] toRecipients = new String[] { "sendme@me.com", "", }; emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, toRecipients); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "blah blah subject"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml("blah blah body")); startActivity(Intent.createChooser(emailIntent, "")); 

结果

在这里输入图像说明

这两种方式都有一些小缺陷,我向你们展示两种方式,现在你们可以select一种。