我的應用程序集成了電子郵件,用戶可以直接從應用程序提交錯誤報告,反饋等。我使用application/octet-stream作爲Intent的SetType。當你去提交電子郵件,你會得到內容選擇器,它顯示來自Evernote,Facebook,電子郵件等各種項目。Android意圖選擇器只顯示電子郵件選項
我怎樣才能讓這個選擇器只顯示電子郵件,以免將用戶與所有其他符合內容選擇器類型的項目混淆?
謝謝。
我的應用程序集成了電子郵件,用戶可以直接從應用程序提交錯誤報告,反饋等。我使用application/octet-stream作爲Intent的SetType。當你去提交電子郵件,你會得到內容選擇器,它顯示來自Evernote,Facebook,電子郵件等各種項目。Android意圖選擇器只顯示電子郵件選項
我怎樣才能讓這個選擇器只顯示電子郵件,以免將用戶與所有其他符合內容選擇器類型的項目混淆?
謝謝。
我假設您使用的是ACTION_SEND
Intent
操作,因爲您沒有打算實際說出您正在使用的內容,但您同意@ Aleadam的評論。
我正在使用application/octet-stream作爲意圖的SetType。
該句子中沒有任何內容限制電子郵件。
ACTION_SEND
是一個通用的Intent
行動,可以由任何想要的應用程序支持。您所做的只是指出您要共享的數據和該數據的MIME類型 - 從這裏開始,用戶可以從可用活動中進行選擇。
正如@Jasoon所示,您可以嘗試message/rfc822
作爲MIME類型。但是,這並不表示「僅提供電子郵件客戶端」 - 它表示「提供支持message/rfc822
數據的任何內容」。這可能很容易包含一些非電子郵件客戶端的應用程序。
如果您特別想通過電子郵件發送內容,將JavaMail集成到您的應用程序中,或者在您的Web服務器上編寫電子郵件轉發腳本並調用它,或者其他內容。如果您使用的是ACTION_SEND
,則隱含地指出用戶需要的是重要的內容,並且您希望用戶能夠通過用戶選擇的任何方式發送諸如此類的數據。
有一種更通用的方法來處理任何MIME類型。
它是可以限制的意圖選擇器只是幾個選項的選擇。 the answer to this question中的代碼就是一個很好的例子。實質上,您必須創建一個LabeledIntents列表以提供給意向選擇器,然後將其包含在列表中。請注意,此解決方案不適用於排除(某些應用程序被排除在外,其他應用程序仍然保留),但您必須選擇要顯示的應用程序。希望能幫助到你!
我解決了代碼的簡單的線條這個問題,因爲Android的文檔中的解釋(https://developer.android.com/guide/components/intents-common.html#Email)
最重要的就是標誌:它是ACTION_SENDTO
,而不是ACTION_SEND
其他重要的行是
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
順便說一句,如果你發送一個空的Extra
,if()
最後將不起作用,應用程序將不會啓動電子郵件客戶端。
這適用於我。根據Android文檔。如果您想確保您的意圖僅由電子郵件應用程序(而不是其他文本消息或社交應用程序)處理,則使用ACTION_SENDTO操作幷包含「mailto:」數據方案。例如:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
不幸的是不能使用附件:( – 2015-08-02 22:15:49
我對附件問題感到抱歉,我不知道如何實現。 – 2015-09-10 15:18:25
galath感謝您的類型更正 – 2015-10-08 16:14:53
就這一問題陷入困境,而實現魔法鏈接功能,爲所有已安裝的電子郵件應用一個選擇器意圖:
private void openEmailApp() {
List<Intent> emailAppLauncherIntents = new ArrayList<>();
//Intent that only email apps can handle:
Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
emailAppIntent.setData(Uri.parse("mailto:"));
emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");
PackageManager packageManager = getPackageManager();
//All installed apps that can handle email intent:
List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);
for (ResolveInfo resolveInfo : emailApps) {
String packageName = resolveInfo.activityInfo.packageName;
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
emailAppLauncherIntents.add(launchIntent);
}
//Create chooser
Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
startActivity(chooserIntent);
}
我也在實施魔術鏈接功能,我只想顯示選擇器顯示所有電子郵件客戶端,然後查看收件箱。提到的解決方案是發送電子郵件。您的解決方案完美適用於我的用例謝謝! – user2622786 2017-08-14 23:34:15
真的很棒的解決方法 – saturov 2017-09-05 11:03:38
它適用於所有設備。這將只顯示電子郵件應用
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
它適用於所有devices.It將只顯示電子郵件應用
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
/*if you want to attach something*/
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
你添加所有的臨時演員,如下所示:http://stackoverflow.com/questions/2197741 /如何發送電子郵件從我的android應用程序/ 2197841#2197841? – Aleadam 2011-06-06 18:07:26
是的,我確定。它工作,它發送電子郵件。我只是想消除內容選擇器顯示的所有內容。我只想顯示「電子郵件」或電子郵件相關的程序。我不確定爲什麼所有這些人都出現,我認爲這是因爲他們可以處理應用程序/八位字節流類型。 – Neal 2011-06-06 18:11:37
假設你遇到了與message/rfc822相同的問題? – Jasoon 2011-06-06 18:15:01