Выбор электронной почты Android - PullRequest
2 голосов
/ 20 октября 2010

Я пишу приложение, которое должно отправлять электронные письма в конце каждой транзакции. Я делаю следующее:

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

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

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

Ответы [ 3 ]

7 голосов
/ 01 марта 2013

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

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

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

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

4 голосов
/ 21 октября 2010

Вот решение:

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 голосов
/ 20 октября 2010

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

...