Выбор электронной почты для 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..."));

Что бы я хотел сделать, это предварительно выбрать программное обеспечение электронной почты и сохранить его в настройках. Таким образом, каждый раз, когда отправляется электронное письмо, ему не нужно спрашивать пользователя, какой адрес электронной почты использовать. Я просто не могу понять, как вызвать выборщика и получить выбранное значение.

Любая помощь будет принята с благодарностью.

Ответ 1

Вам нужно будет создать свой собственный выбор, возможно, как AlertDialog, используя результаты вызова queryIntentActivities() на PackageManager.

Ответ 2

Это распространенное заблуждение использовать text/plain или text/html. Это приведет к запуску любого приложения, которое может обрабатывать простые текстовые файлы или HTML файлы без какого-либо контекста, включая Google Диск, Dropbox, Evernote и Skype.

Вместо этого используйте ACTION_SENDTO, предоставляя mailto: Uri:

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

Затем вы можете продолжить использование выбора, как это предлагается с помощью других ответов.

Ответ 3

Вот решение:

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);