Ответ 1
Вам нужно будет создать свой собственный выбор, возможно, как AlertDialog
, используя результаты вызова queryIntentActivities()
на PackageManager
.
Я пишу приложение, которое должно отправлять электронные письма в конце каждой транзакции. Я делаю следующее:
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..."));
Что бы я хотел сделать, это предварительно выбрать программное обеспечение электронной почты и сохранить его в настройках. Таким образом, каждый раз, когда отправляется электронное письмо, ему не нужно спрашивать пользователя, какой адрес электронной почты использовать. Я просто не могу понять, как вызвать выборщика и получить выбранное значение.
Любая помощь будет принята с благодарностью.
Вам нужно будет создать свой собственный выбор, возможно, как AlertDialog
, используя результаты вызова queryIntentActivities()
на PackageManager
.
Это распространенное заблуждение использовать text/plain
или text/html
. Это приведет к запуску любого приложения, которое может обрабатывать простые текстовые файлы или HTML файлы без какого-либо контекста, включая Google Диск, Dropbox, Evernote и Skype.
Вместо этого используйте ACTION_SENDTO
, предоставляя mailto:
Uri:
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
Затем вы можете продолжить использование выбора, как это предлагается с помощью других ответов.
Вот решение:
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);