【发布时间】:2016-09-08 01:33:37
【问题描述】:
有两个要求:
- 带附件的电子邮件
- 在
Intent选择器中,应该只有电子邮件应用程序。
我知道/做过的事:
Intent.ACTION_SENDTO和intent.setData(Uri.parse("mailto:"))可以确保Intent选择器中只有电子邮件应用程序,但它不会带附件(对于某些应用程序,例如 Gmail,它会,但也有很多应用程序会忽略附件)。Intent.ACTION_SEND可以发送带有附件的电子邮件。但是,在Intent选择器中,会有一些应用程序实际上不是电子邮件应用程序,但可以响应Intent.ACTION_SEND。使用intent.setType("message/rfc822")可以减少这些应用的数量,但不是全部。-
参考这个答案: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); } }但是在某些设备上(比如小米2S和MIUI V5,不知道会不会受到第三方rom的影响),结果是一个空的
Intent选择器。而且似乎在Android 6.0以上,Intent.EXTRA_INITIAL_INTENTS有一些bug(Custom intent-chooser - why on Android 6 does it show empty cells?,还有一个:https://code.google.com/p/android/issues/detail?id=202693)。
因此,我不知道如何实现我的目标。请帮助我,提前谢谢你。
【问题讨论】:
-
"Intent.ACTION_SENDTO 和 intent.setData(Uri.parse("mailto:")) 可以确保 Intent 选择器中只有电子邮件应用程序" -- 不,它没有。它将选择支持
Intent结构的任何应用程序放入选择器中。任何人都可以编写这样的应用程序,它可能不是“电子邮件应用程序”。没有关于“电子邮件应用程序”是什么的通用声明。 -
@CommonsWare 是的,我知道。但我说的是普通情况。我们可以说,一个应用程序具有
IntentFilterforIntent.ACTION_SEND和数据方案为“mailto”,如果它是一个正式应用程序,它应该具有处理电子邮件事件的能力,因此我们可以将其视为“电子邮件应用程序” "。 -
@ywwynm 使用 .setType("message/rfc822") 或选择器将向您显示所有(许多)支持发送意图的应用程序。
-
@Stanojkovic 你能仔细看看我的问题描述吗?在“我所知道/做过的事情”部分,我说我尝试使用“message/rfc822”,但它不符合我的需求。
-
@ywwynm 这就是我管理发送邮件的方式:
String mailTo = "email@gmail.com";Intent email_intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", mailTo, null));
标签: android email android-intent