Android email chooser

2020-02-05 05:52发布

问题:

I am writing an app that needs to send emails at the end of each transaction. I am doing the following:

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

What I would like to do is pre-select the email software and store it in a setting. That way, every time the email is being sent, it does not have to ask the user which email to use. I just can't seem to figure out how to invoke the chooser and get the selected value.

Any help would be greatly appreciated.

回答1:

You would have to create your own chooser, possibly as an AlertDialog populated using the results of calling queryIntentActivities() on PackageManager.



回答2:

It's a common misconception to use text/plain or text/html. This will trigger any application that can handle plain or HTML text files without any context, including Google Drive, Dropbox, Evernote and Skype.

Instead use a ACTION_SENDTO, providing the mailto: Uri:

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

You can then proceed using the chooser as suggested through the other answers.



回答3:

Here is the solution:

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

Save the choice for later use:

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

Now, to consume it, just to the following:

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

fill in rest of data and start the activity

if (chooser == null) {
  chooser = Intent.createChooser(mail,"Select Email Software..."); 
}
startActivity(chooser);