2010-10-20 31 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

相关问题