2011-06-06 74 views
20

我的應用程序集成了電子郵件,用戶可以直接從應用程序提交錯誤報告,反饋等。我使用application/octet-stream作爲Intent的SetType。當你去提交電子郵件,你會得到內容選擇器,它顯示來自Evernote,Facebook,電子郵件等各種項目。Android意圖選擇器只顯示電子郵件選項

我怎樣才能讓這個選擇器只顯示電子郵件,以免將用戶與所有其他符合內容選擇器類型的項目混淆?

謝謝。

+1

你添加所有的臨時演員,如下所示:http://stackoverflow.com/questions/2197741 /如何發送電子郵件從我的android應用程序/ 2197841#2197841? – Aleadam 2011-06-06 18:07:26

+0

是的,我確定。它工作,它發送電子郵件。我只是想消除內容選擇器顯示的所有內容。我只想顯示「電子郵件」或電子郵件相關的程序。我不確定爲什麼所有這些人都出現,我認爲這是因爲他們可以處理應用程序/八位字節流類型。 – Neal 2011-06-06 18:11:37

+0

假設你遇到了與message/rfc822相同的問題? – Jasoon 2011-06-06 18:15:01

回答

13

我假設您使用的是ACTION_SENDIntent操作,因爲您沒有打算實際說出您正在使用的內容,但您同意@ Aleadam的評論。

我正在使用application/octet-stream作爲意圖的SetType。

該句子中沒有任何內容限制電子郵件。

ACTION_SEND是一個通用的Intent行動,可以由任何想要的應用程序支持。您所做的只是指出您要共享的數據和該數據的MIME類型 - 從這裏開始,用戶可以從可用活動中進行選擇。

正如@Jasoon所示,您可以嘗試message/rfc822作爲MIME類型。但是,這並不表示「僅提供電子郵件客戶端」 - 它表示「提供支持message/rfc822數據的任何內容」。這可能很容易包含一些非電子郵件客戶端的應用程序。

如果您特別想通過電子郵件發送內容,將JavaMail集成到您的應用程序中,或者在您的Web服務器上編寫電子郵件轉發腳本並調用它,或者其他內容。如果您使用的是ACTION_SEND,則隱含地指出用戶需要的是重要的內容,並且您希望用戶能夠通過用戶選擇的任何方式發送諸如此類的數據。

0

它是可以限制的意圖選擇器只是幾個選項的選擇。 the answer to this question中的代碼就是一個很好的例子。實質上,您必須創建一個LabeledIntents列表以提供給意向選擇器,然後將其包含在列表中。請注意,此解決方案不適用於排除(某些應用程序被排除在外,其他應用程序仍然保留),但您必須選擇要顯示的應用程序。希望能幫助到你!

23

我解決了代碼的簡單的線條這個問題,因爲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*** 

順便說一句,如果你發送一個空的Extraif()最後將不起作用,應用程序將不會啓動電子郵件客戶端。

這適用於我。根據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); 
    } 
} 
+1

不幸的是不能使用附件:( – 2015-08-02 22:15:49

+0

我對附件問題感到抱歉,我不知道如何實現。 – 2015-09-10 15:18:25

+0

galath感謝您的類型更正 – 2015-10-08 16:14:53

3

就這一問題陷入困境,而實現魔法鏈接功能,爲所有已安裝的電子郵件應用一個選擇器意圖:

Chooser Intent Screenshot

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); 
} 
+0

我也在實施魔術鏈接功能,我只想顯示選擇器顯示所有電子郵件客戶端,然後查看收件箱。提到的解決方案是發送電子郵件。您的解決方案完美適用於我的用例謝謝! – user2622786 2017-08-14 23:34:15

+0

真的很棒的解決方法 – saturov 2017-09-05 11:03:38

1

它適用於所有設備。這將只顯示電子郵件應用

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(); 
    } 
} 
0

它適用於所有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(); 
     } 
} 
相關問題