我正在编写一个需要在每笔交易结束时发送电子邮件的应用。我正在做以下事情:
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..."));
我想要做的是预先选择电子邮件软件并将其存储在设置中。这样,每次发送电子邮件时,都不必询问用户使用哪个电子邮件。我似乎无法弄清楚如何调用选择器并获得所选值。
非常感谢任何帮助。
答案 0 :(得分:7)
使用text/plain
或text/html
是一种常见的误解。这将触发任何可以处理普通或HTML文本文件而无任何上下文的应用程序,包括Google Drive,Dropbox,Evernote和Skype。
而是使用ACTION_SENDTO
,提供mailto:
Uri:
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
然后,您可以按照其他答案的建议继续使用选择器。
答案 1 :(得分: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);
答案 2 :(得分:2)
您必须创建自己的选择器,可能使用在AlertDialog
上调用queryIntentActivities()
的结果填充PackageManager
。