web-dev-qa-db-fra.com

Utilisation d'Android Intent.ACTION_SEND pour l'envoi de courrier électronique

J'utilise Intent.ACTION_SEND pour envoyer un email. Cependant, lorsque j'appelle la variable intent, elle affiche les choix suivants: envoyer un message, envoyer un courrier électronique et également envoyer via Bluetooth. Je veux qu'il montre seulement les choix d'envoyer un email. Comment puis-je faire ceci? 

25
Ganapathy C
Intent email = new Intent(Android.content.Intent.ACTION_SEND);  
                    email.setType("application/octet-stream");    

MODIFIER:
Vous pouvez également essayer de définir le type sur "message/rfc822".

essaye ça.... 

23
N-JOY

@Ganapathy: essayez ce code pour afficher gmail

Intent gmail = new Intent(Intent.ACTION_VIEW);
                gmail.setClassName("com.google.Android.gm","com.google.Android.gm.ComposeActivityGmail");
                gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
                gmail.setData(Uri.parse("[email protected]"));
                gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                gmail.setType("plain/text");
                gmail.putExtra(Intent.EXTRA_TEXT, "hi Android jack!");
                startActivity(gmail);
19
Jack Dsilva

Je ne prends pas le crédit pour cette réponse, mais je crois que cela donne la meilleure réponse pour ce post.

C'est une idée fausse commune d'utiliser text/plain ou text/html. Cela déclenchera toute application pouvant gérer des fichiers texte simples ou HTML sans contexte, y compris Google Drive, Dropbox, Evernote et Skype.

Utilisez plutôt un ACTION_SENDTO, en fournissant le mailto: Uri

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

Vous pouvez ensuite utiliser le sélecteur comme suggéré dans les autres réponses.

Répondu par @PaulLammertsma ici Choix de la messagerie Android

19
toobsco42

Cela vous aidera.

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});          
email.putExtra(Intent.EXTRA_SUBJECT, "subject");
email.putExtra(Intent.EXTRA_TEXT, "message");
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
14
Jignesh Mayani

[Solution pour API NIVEAU> = 15]

J'ai finalement réussi à envoyer des courriels AVEC pièces jointes à SEULEMENT des clients de messagerie . Je les écris ici parce que cela m'a pris beaucoup de temps et que cela pourrait être utile à d'autres.

Le problème est:

  • Intent.ACTION_SENDTO accepte l'URI des données (vous pouvez donc spécifier "schema mailto:" ). MAIS il n'accepte pas l'intention: EXTRA_STREAM.

  • Intent.ACTION_SEND accepte Intent: EXTRA_STREAM (vous pouvez donc ajouter Pièce jointe) MAIS il ne faut que Type (pas l'URI de données, vous ne pouvez donc pas Spécifier le schéma "mailto:").

Ainsi, Intent.ACTION_SEND permet à l'utilisateur de choisir parmi plusieurs activités, même si vous définissez Type ("message/rfc822"), car cette application/Activités peut gérer tous les types de fichiers (notamment les applications GDrive/Dropbox) et même les fichiers de messagerie.

La solution réside dans la méthode setSelector . Avec cette méthode, vous pouvez utiliser Intent.ACTION_SENDTO pour sélectionner l'activité, puis envoyer l'intention Intent.ACTION_SEND.

Voici mon code de solution (la pièce jointe provient d'un FileProvider, mais il peut s'agir de n'importe quel fichier):

{
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
    emailSelectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    emailIntent.setSelector( emailSelectorIntent );

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile);
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment);

    if( emailIntent.resolveActivity(getPackageManager()) != null )
        startActivity(emailIntent);
}
12
ARLabs

Utiliser message/rfc822 comme indiqué ici: ACTION_SEND force l'envoi avec email résout le problème.

7
Gawcio

J'ai eu un problème similaire avec mon application. J'ai récemment trouvé ce lien sur le site officiel des développeurs Android qui aide vraiment! Common Intents: Email

TL; DR: 

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

Maintenant, vous ne verrez que les clients de messagerie!

Vous pouvez ajouter un sujet et un corps en procédant comme suit: 

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body" );
6
Avi Parshan

Je remarque que c’est une question assez ancienne, mais c’est le premier résultat de la recherche d’une solution "Envoyer un courrier" et toutes les réponses ont un problème commun:

Utiliser Intent.ACTION_SEND et intent.setType("message/rfc822") créera un sélecteur qui affichera non seulement les applications de messagerie, mais également toutes les applications pouvant gérer le support de type MIME tout par message/rfc822, par exemple. .mhtml, .mht, .mime. En plus des applications de messagerie, ceci pourrait être Google Drive, Dropbox, Evernote, etc.

La seule solution que j'ai trouvée pour limiter le sélecteur aux applications de messagerie consiste à utiliser plutôt Intent.ACTION_SENDTO:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail");
intent.putExtra(Intent.EXTRA_TEXT   , "My Message");

try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (Android.content.ActivityNotFoundException ex) {
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
3
Andrei Herford

Première solution: essayez d’être plus précis dans vos paramètres d’intention. Ajouter un destinataire de message par exemple 

emailIntent .putExtra(Android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});

Deuxième solution: utilisez le package manager pour trouver toutes les applications capables d’envoyer un message et sélectionnez celles que vous voulez utiliser.

2
Jcs

Voici une combinaison des solutions Jack Dsilva et Jignesh Mayani:

    try
    {
        Intent gmailIntent = new Intent(Intent.ACTION_SEND);
        gmailIntent.setType("text/html");

        final PackageManager pm = _activity.getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0);
        String gmailActivityClass = null;

        for (final ResolveInfo info : matches)
        {
            if (info.activityInfo.packageName.equals("com.google.Android.gm"))
            {
                gmailActivityClass = info.activityInfo.name;

                if (gmailActivityClass != null && !gmailActivityClass.isEmpty())
                {
                    break;
                }
            }
        }

        gmailIntent.setClassName("com.google.Android.gm", gmailActivityClass);
        gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message");
        gmailIntent.setData(Uri.parse("[email protected]"));
        this._activity.startActivity(gmailIntent);
    }

    catch (Exception e)
    {
        Intent i = new Intent(Intent.ACTION_SEND);
        i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        i.putExtra(Intent.EXTRA_TEXT, "Email message");
        i.setType("plain/text");
        this._activity.startActivity(i);
    }

Ainsi, dans un premier temps, il tentera d'ouvrir l'application Gmail et, au cas où un utilisateur ne l'aurait pas, la seconde approche serait mise en œuvre.

0
Sa Qada

Cela a sauvé ma journée. Il envoie un message texte directement à l’application gmail:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                        "mailto","togmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message");
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString());
startActivity(Intent.createChooser(emailIntent, "Send email..."));
0
Kristene