有兩個要求:如何僅使用電子郵件應用程序發送帶附件的電子郵件?
- 電子郵件帶有附件
- 在
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); } }
然而,在某些設備(例如,MIUI V5小蜜2S,我不知道這是否可以由第三方ROM的影響),結果是空
Intent
選擇器。而且似乎上面的Android 6.0,Intent.EXTRA_INITIAL_INTENTS
有一些錯誤(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(」電子郵件地址:「))可以確保有規定的故意選擇器只通過電子郵件應用程序」 - 不,不是的。它會在選擇器中選擇支持該「意圖」結構的應用程序。任何人都可以編寫這樣的應用程序,它可能不是一個「電子郵件應用程序」。沒有關於「電子郵件應用程序」的普遍聲明。 – CommonsWare
@CommonsWare是的,我知道。但我在談論普通情況。我們可以說,一個應用程序,其Intent.ACTION_SEND有一個IntentFilter,數據模式爲mailto,如果它是一個正式的應用程序,它應該有能力處理電子郵件事件,因此我們可以將其視爲一個「電子郵件應用「。 – ywwynm
@ywwynm使用.setType(「message/rfc822」)或者選擇器會顯示所有支持發送意圖的(許多)應用程序。 – Stanojkovic