2010-10-20 29 views
2

我正在寫一個應用程序,需要在每次交易結束時發送電子郵件。我做了以下情況:Android電子郵件選擇器

Intent mail = new Intent(Intent.ACTION_SEND); 
mail.setType("text/html"); 
mail.putExtra(Intent.EXTRA_EMAIL, new String[] { emailTo }); 
mail.putExtra(Intent.EXTRA_SUBJECT, "Send from Android"); 
mail.putExtra(Intent.EXTRA_TEXT, "Sent from Android"); 
startActivity(Intent.createChooser(mail,"Select Email Software...")); 

我想這樣做是預先選擇的電子郵件軟件並將其存儲在一個設置。這樣,每次發送電子郵件時,都不必詢問用戶要使用哪封電子郵件。我似乎無法弄清楚如何調用選擇器並獲取選定的值。

任何幫助將不勝感激。

回答

2

您必須創建自己的選擇器,可能是AlertDialog,使用PackageManager上的queryIntentActivities()調用結果填充。

4

這裏是解決方案:

private void setSpinnerValues() { 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("text/html"); 
    PackageManager pm = getPackageManager(); 
    emailers = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_RESOLVED_FILTER); 

    if (emailers.size() == 0) { 
     spnEmailProgram.setEnabled(false); 
     return; 
    } 
    spnEmailProgram.setEnabled(true); 
    CharSequence[] sa = new CharSequence[emailers.size()]; 
    int lastPosition = 0; 
    for (int i = 0; i < emailers.size(); i++) { 
     ResolveInfo r = emailers.get(i); 
     sa[i] = pm.getApplicationLabel(r.activityInfo.applicationInfo); 
     if (r.activityInfo.name.equalsIgnoreCase(Options.EmailClass)) { 
      lastPosition = i; 
     } 
    } 
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, 
      android.R.layout.simple_spinner_item, sa); 
    adapter. 
       setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spnEmailProgram.setAdapter(adapter); 
    spnEmailProgram.setSelection(lastPosition); 
} 

保存以供日後使用的選擇:

if (emailers.size() == 0) { 
     Options.EmailProgram = ""; 
     Options.EmailClass = ""; 
    } else { 
     ResolveInfo r = emailers.get(spnEmailProgram.getSelectedItemPosition()); 
     Options.EmailProgram = r.activityInfo.packageName; 
     Options.EmailClass = r.activityInfo.name; 
    } 

現在,消費它,只是爲以下:

Intent mail = new Intent(Intent.ACTION_SEND); 
mail.setType("text/html"); 
Intent chooser = null; 
if (Options.EmailProgram!=null && Options.EmailProgram.length()>0) { 
    mail.setClassName(Options.EmailProgram,Options.EmailClass); 
    chooser = mail; 
} 

填寫其餘數據並開始活動

if (chooser == null) { 
    chooser = Intent.createChooser(mail,"Select Email Software..."); 
} 
startActivity(chooser); 
+0

做得好jd1 ..很有幫助 – ruben 2011-06-19 15:19:12

+1

小心使用'新的Intent(Intent.ACTION_SEND).setType(「text/html」)';它的語義是發送一個HTML文件。大多數電子郵件客戶端只有'巧合'才符合這一意圖,但請記住許多其他應用程序也是如此,例如Drive,Dropbox和Skype。更好的方法是使用'ACTION_SENDTO'並指定'mailto:'Uri方案。 – 2013-03-11 17:25:29

5

使用text/plaintext/html是一種常見的誤解。這將觸發任何可以處理純文本或HTML文本文件而無需任何上下文的應用程序,包括Google Drive,Dropbox,Evernote和Skype。

改用ACTION_SENDTO,提供mailto:烏里:

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); 

然後,您可以繼續使用該選擇器通過其他答案建議。

+0

最後,只顯示郵件客戶端的答案。有一件事我注意到了。這將默認選擇選擇GMail,而不是允許用戶首先選擇哪個電子郵件客戶端。你如何解決這個問題? – toobsco42 2014-03-10 01:51:38

+0

@ toobsco42您可能已將Gmail設置爲默認處理程序。 – 2014-03-10 08:03:31

+0

其實我在電子郵件應用程序上設置了一個帳戶。然後,我卸載了我的應用程序並重新安裝了我的應用程序,並看到相同的事情。 – toobsco42 2014-03-10 14:39:37

相關問題