Envoyer l'intention par e-mail

588
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");

startActivity(Intent.createChooser(intent, "Send Email"));

Le code ci-dessus ouvre une boîte de dialogue affichant les applications suivantes: - Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype etc.

En fait, je veux filtrer ces options de liste. Je souhaite afficher uniquement les applications liées aux e-mails, par exemple Gmail, Yahoo Mail. Comment faire?

J'ai vu un tel exemple sur l'application 'Android Market'.

  1. Ouvrez l'application Android Market
  2. Ouvrez n'importe quelle application où le développeur a spécifié son adresse e-mail. (Si vous ne trouvez pas une telle application, ouvrez simplement mon application: - market: // details? Id = com.becomputer06.vehicle.diary.free, OU recherchez par 'Vehicle Diary')
  3. Faites défiler jusqu'à «DÉVELOPPEUR»
  4. Cliquez sur «Envoyer un e-mail»

La boîte de dialogue affiche uniquement les applications de messagerie, par exemple Gmail, Yahoo Mail, etc. Elle n'affiche pas Bluetooth, Orkut, etc. Quel code produit une telle boîte de dialogue?

dira
la source
4
Désolé, ce n'est pas possible avec Intent.ACTION_SEND. Peut-être que cela fonctionne avec une intention directement sur l'application gmail, mais je ne sais pas si c'est possible.
Thommy
19
Dans le cas où quelqu'un apprendrait ici sur les intentions de messagerie, EXTRA_MAIL devrait correspondre à un String[], pas seulement un Stringcomme indiqué ici.
bigstones
doublon possible de Envoyer un e-mail via gmail
Sergey Glotov
Copie
Avi Parshan
Voir ici pour quelques bons conseils: medium.com/@cketti/…
Felix D.

Réponses:

218

lorsque vous modifierez votre intention.setType comme ci-dessous, vous obtiendrez

intent.setType("text/plain");

Utilisez android.content.Intent.ACTION_SENDTOpour obtenir uniquement la liste des clients de messagerie, sans facebook ni autres applications. Juste les clients de messagerie. Ex:

new Intent(Intent.ACTION_SENDTO);

Je ne vous suggérerais pas d'accéder directement à l'application de messagerie. Laissez l'utilisateur choisir son application de messagerie préférée. Ne le contraignez pas.

Si vous utilisez ACTION_SENDTO, putExtra ne fonctionne pas pour ajouter un sujet et du texte à l'intention. Utilisez Uri pour ajouter le sujet et le corps du texte.

EDIT: Nous pouvons utiliser message/rfc822au lieu de "text/plain"comme type MIME. Cependant, cela n'indique pas «ne proposer que des clients de messagerie» - cela indique «offrir tout ce qui prend en charge les données de message / rfc822». Cela pourrait facilement inclure certaines applications qui ne sont pas des clients de messagerie.

message/rfc822 prend en charge les types MIME de .mhtml, .mht, .mime

Padma Kumar
la source
7
Pouvez-vous s'il vous plaît fournir du code pour produire la sortie souhaitée?
dira
9
@ becomputer06 référez ceci: stackoverflow.com/questions/8284706/send-email-via-gmail
Padma Kumar
76
Le sélecteur d'intention dit no apps installed to perform this intentquand j'utilise ACTION_SENDTO. J'utilise Android 4.1.2 et j'ai installé une application de messagerie ...
ffleandro
4
La manière «correcte» est la réponse de Magnus. Je recommande l'affiche originale pour changer la réponse acceptée.
jhabbott
8
L'utilisation du type MIME pour effectuer une opération d'envoi est une mauvaise idée, car vous demandez essentiellement à Android de fournir une liste d'applications prenant en charge l'envoi d'un fichier de type message/rfc822. Ce n'est pas la même chose que d'envoyer un e-mail. Utilisez mailto:plutôt le protocole, car c'est ce que les clients de messagerie comprennent réellement.
Paul Lammertsma
872

La réponse acceptée ne fonctionne pas sur le 4.1.2. Cela devrait fonctionner sur toutes les plateformes:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","[email protected]", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

J'espère que cela t'aides.

Mise à jour: Selon marcwjj , il semble que sur 4.3, nous devons passer un tableau de chaînes au lieu d'une chaîne pour l'adresse e-mail pour le faire fonctionner. Nous devrons peut-être ajouter une ligne supplémentaire:

intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses

Lien de référence

thanhbinh84
la source
7
Vous avez raison, et ce n'est pas le cas non plus sur 4.2. C'est donc la seule bonne réponse, merci!
mDroidd
12
C'est parfait. Quelqu'un ci-dessous a mentionné que la spécification de la partie «mailto» est ce qui restreint les options disponibles aux clients de messagerie. L'utilisation d'Uri.fromParts ("mailto", "", null) mettra le curseur dans le champ du destinataire - parfait pour ce dont j'avais besoin.
Shaggy
24
Essayez cet emailIntent.putExtra (Intent.EXTRA_TEXT, "I'm email body.");
thanhbinh84
15
Si vous n'avez pas de destinataire spécifique, cela fonctionne également:Uri.fromParts("mailto", "", null)
Phil
25
Cela ne fonctionne plus sur mon Android 4.3. Veuillez consulter le document officiel Android sur l'envoi d'e-mails comme prévu, ce qui fonctionne parfaitement: developer.android.com/guide/components/…
marcwjj
244

Il existe trois approches principales:

String email = /* Your email address here */
String subject = /* Your subject here */
String body = /* Your body here */
String chooserTitle = /* Your chooser title here */

1. Personnalisé Uri:

Uri uri = Uri.parse("mailto:" + email)
    .buildUpon()
    .appendQueryParameter("subject", subject)
    .appendQueryParameter("body", body)
    .build();

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(Intent.createChooser(emailIntent, chooserTitle));

2. Utiliser des Intentextras:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
//emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, body); //If you are using HTML in your body text

startActivity(Intent.createChooser(emailIntent, "Chooser Title"));

3. Bibliothèque de support ShareCompat:

Activity activity = /* Your activity here */

ShareCompat.IntentBuilder.from(activity)
    .setType("message/rfc822")
    .addEmailTo(email)
    .setSubject(subject)
    .setText(body)
    //.setHtmlText(body) //If you are using HTML in your body text
    .setChooserTitle(chooserTitle)
    .startChooser();
dira
la source
1
Cela a fonctionné beaucoup mieux pour moi - les autres options sont apparues comme des gestionnaires possibles (Skype, par exemple).
Chris Rae
1
Si vous avez un %symbole dans le tampon, certains caractères dans l'e-mail résultant ne seront pas correctement encodés. Vous devez exécuter la Uri.encodedanse suggérée par @minipif.
Giulio Piancastelli
12
Ce sont les meilleures réponses ici, ne perdez pas votre temps à essayer les autres, la seconde ici est ce que j'ai choisi et cela fonctionne parfaitement, ne montrant que les applications de messagerie électronique pure, pas gDrive, pas bluetooth .. etc. Merci @ becomputer06
Hugo
1
Faites attention au caractère "&". Si vous avez & caractère dans le corps de l'e-mail, cette méthode coupera le corps après &. Par exemple, si vous envoyez un corps comme "Je suis et un échantillon de corps", vous obtiendrez juste "Je suis"
Emre Koç
4
ShareCompat génère presque toutes les applications, pas seulement les clients de messagerie!
rpattabi
111

Ceci est cité dans le document officiel Android, je l'ai testé sur Android 4.4 et fonctionne parfaitement. Voir plus d'exemples sur https://developer.android.com/guide/components/intents-common.html#Email

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
marcwjj
la source
6
D'accord! Je suis surpris qu'une réponse comme celle-ci soit si loin dans la liste. Je suppose que cela a dû être un changement relativement récent dans les documents Android.
Mikey
Génial! fiable, il fait référence à la «Bible» des développeurs d'applications Android.
dev_android
1
Le colon après mailto a fait l'affaire pour moi! J'utilisais "mailto" au lieu de "mailto:"
Nigel Crasto
1
Travailler sur 5.1.1. Les autres options ne fonctionnent pas pour moi.
Juanin
1
EXTRA_EMAILne fonctionne pas pour moi, donc j'ai utiliséUri.parse("mailto: " + myEmail)
Pratik Butani
89

Une réponse tardive, bien que j'aie trouvé une solution qui pourrait aider les autres:

Version Java

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:[email protected]"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));


Version Kotlin

val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
    data = Uri.parse("mailto:[email protected]")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))


C'était ma sortie (seulement Gmail + Inbox suggéré):

ma sortie

J'ai obtenu cette solution sur le site des développeurs Android .

capt.swag
la source
2
Pour moi, il était important qu'il n'y ait pas d'espace entre mailtoet l'e-mail:mailto:[email protected]
AlvaroSantisteban
C'est la bonne réponse.
nibbana
36

Cela fonctionne pour moi:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL  , new String[] { "[email protected]" });
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");

startActivity(Intent.createChooser(intent, "Email via..."));

c'est-à-dire utiliser l' ACTION_SENDTOaction plutôt que l' ACTION_SENDaction. Je l'ai essayé sur quelques appareils Android 4.4 et il limite la fenêtre contextuelle du sélecteur pour n'afficher que les applications de messagerie (e-mail, Gmail, Yahoo Mail, etc.) et il insère correctement l'adresse e-mail et l'objet dans l'e-mail.

Adil Hussain
la source
35

Essayer:

intent.setType("message/rfc822");
Magnus
la source
Il a raison, je l'ai essayé et propose [Drive, Email, Gmail, Skype], cela devrait être la "bonne réponse"
gurbieta
18
L'utilisation du type MIME pour effectuer une opération d'envoi est une mauvaise idée, car vous demandez essentiellement à Android de fournir une liste d'applications prenant en charge l'envoi d'un fichier de type message/rfc822. Ce n'est pas la même chose que d'envoyer un e-mail. Utilisez mailto:plutôt le protocole, car c'est ce que les clients de messagerie comprennent réellement.
Paul Lammertsma
34

C'est la bonne façon d'envoyer l'intention de l'e-mail en fonction de la documentation officielle du développeur Android

Ajoutez ces lignes de code à votre application:

Intent intent = new Intent(Intent.ACTION_SEND);//common intent 
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Facultatif: ajoutez le corps et le sujet, comme ceci

intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here");
intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" );

Vous avez déjà ajouté cette ligne, mais c'est bien d'avoir pour les nouveaux utilisateurs

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

Ce sera l'adresse du destinataire, ce qui signifie que l'utilisateur vous enverra (le développeur) un e-mail.

Avi Parshan
la source
@ barnacle.m Merci! C'est aussi l'une des méthodes les plus simples. Le problème est que ma réponse n'obtient pas assez de votes positifs :(
Avi Parshan
1
C'est parce qu'il y a beaucoup de réponses similaires, mais celle-ci souligne la documentation officielle d'Android à ce sujet.
barnacle.m
1
Je n'ai pas pu envoyer d'adresse e-mail. Je l'ai corrigé comme ceci intent.data = Uri.parse ("mailto: [email protected]")
Hitesh Bisht
18

Enfin, trouvez la meilleure façon de faire

String to = "[email protected]";
String subject= "Hi I am subject";
String body="Hi I am test body";
String mailTo = "mailto:" + to +
        "?&subject=" + Uri.encode(subject) +
        "&body=" + Uri.encode(body);
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse(mailTo));
startActivity(emailIntent);
Ajay Shrestha
la source
Tu es génial, mec.
Ashik
Pas de problème mec
Ajay Shrestha
2
Marche parfaitement.
Solanki Kamlesh
Consultez cet article qui le décrit en détail: medium.com/@cketti/…
Bruno Bieri
fonctionne bien, continuez comme ça
Jacks
15

Si vous ne souhaitez utiliser que les clients de messagerie, vous devez les utiliser android.content.Intent.EXTRA_EMAILavec un tableau. Voici un exemple:

final Intent result = new Intent(android.content.Intent.ACTION_SEND);
result.setType("plain/text");
result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient });
result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
result.putExtra(android.content.Intent.EXTRA_TEXT, body);
Addev
la source
3
Non, apporte toujours beaucoup d'autres applications - beaucoup plus queACTION_SENDTO
Dori
10

Le code suivant fonctionne bien pour moi.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
Anam Ansari
la source
8

De la documentation des développeurs Android :

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
marvatron
la source
8

Edit: ne fonctionne plus avec les nouvelles versions de Gmail

C'était le seul moyen que j'ai trouvé à l'époque pour le faire fonctionner avec n'importe quel personnage.

La réponse de doreamon est la bonne façon de procéder maintenant, car elle fonctionne avec tous les personnages dans les nouvelles versions de Gmail.

Ancienne réponse:


Voici le mien. Il semble fonctionner sur toutes les versions d'Android, avec la prise en charge du sujet et du corps du message, et la prise en charge complète des caractères utf-8:

public static void email(Context context, String to, String subject, String body) {
    StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to));
    if (subject != null) {
        builder.append("?subject=" + Uri.encode(Uri.encode(subject)));
        if (body != null) {
            builder.append("&body=" + Uri.encode(Uri.encode(body)));
        }
    }
    String uri = builder.toString();
    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
    context.startActivity(intent);
}
minipif
la source
1
+1 Uri.encodeest la bonne façon de procéder. Mais pourquoi l'appeler deux fois pour sujet et corps?
Giulio Piancastelli
Donc, faire l'encodage vous-même n'est qu'une mauvaise idée. Mieux vaut utiliser une intention appropriée avec les extras nécessaires, voir par exemple stackoverflow.com/a/15022222
Giulio Piancastelli
Pour moi, c'est la meilleure réponse car d'autres solutions ne fonctionnent correctement qu'avec certaines applications de messagerie. Celui-ci fonctionne avec toutes les applications de messagerie que j'ai testées.
Egis
7

Aucune de ces solutions ne fonctionnait pour moi. Voici une solution minimale qui fonctionne sur Lollipop. Sur mon appareil, seuls Gmail et les applications de messagerie natives apparaissent dans la liste de sélection résultante.

Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
                                Uri.parse("mailto:" + Uri.encode(address)));

emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));
Scott
la source
7

Fonctionne sur toutes les versions Android:

String[] TO = {"[email protected]"};
    Uri uri = Uri.parse("mailto:[email protected]")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
Usama Saeed US
la source
Votre réponse m'a aidé. Merci
Adnan Khan
5

Le code suivant a fonctionné pour moi !!

import android.support.v4.app.ShareCompat;
    .
    .
    .
    .
final Intent intent = ShareCompat.IntentBuilder
                        .from(activity)
                        .setType("application/txt")
                        .setSubject(subject)
                        .setText("Hii")
                        .setChooserTitle("Select One")
                        .createChooserIntent()
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

activity.startActivity(intent);
Suyog Gunjal
la source
5

Cela fonctionne parfaitement pour moi:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));
EpicPandaForce
la source
5

Si vous souhaitez vous assurer que votre intention n'est gérée que par une application de messagerie (et non par d'autres applications de messagerie texte ou sociales), utilisez l' ACTION_SENDTOaction et incluez le schéma de données "mailto:". Par exemple:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

J'ai trouvé cela dans https://developer.android.com/guide/components/intents-common.html#Email

Lamine Slimany
la source
5

à Kotlin si quelqu'un cherche

val emailArrray:Array<String> = arrayOf("[email protected]")
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, emailArrray)
intent.putExtra(Intent.EXTRA_SUBJECT, "Inquire about travel agent")
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
mughil
la source
4

La plupart de ces réponses ne fonctionnent que pour un cas simple lorsque vous n'envoyez pas de pièce jointe . Dans mon cas, j'ai parfois besoin d'envoyer une pièce jointe (ACTION_SEND) ou deux pièces jointes (ACTION_SEND_MULTIPLE).

J'ai donc pris les meilleures approches de ce fil et les ai combinées. Il utilise la bibliothèque de support, ShareCompat.IntentBuildermais je n'affiche que les applications qui correspondent à ACTION_SENDTO avec "mailto:" uri. De cette façon, je ne reçois que la liste des applications de messagerie avec prise en charge des pièces jointes:

fun Activity.sendEmail(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
    val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
    val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
    val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
    val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
    val targetedIntents = originalIntentResults
            .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
            .map {
                createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
            }
            .toMutableList()
    val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
    finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
    startActivity(finalIntent)
}

private fun Activity.createEmailShareIntent(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
    val builder = ShareCompat.IntentBuilder.from(this)
            .setType("message/rfc822")
            .setEmailTo(recipients.toTypedArray())
            .setStream(file)
            .setSubject(subject)
    if (secondFile != null) {
        builder.addStream(secondFile)
    }
    if (text != null) {
        builder.setText(text)
    }
    return builder.intent
}
David Vávra
la source
Il semble que cela pourrait être utile; une chance de l'obtenir en Java?
Kyle Humfeld
1
Kotlin est très similaire à Java, vous devriez pouvoir copier-coller et simplement changer quelques choses.
David Vávra
3

L'utilisation intent.setType("message/rfc822");fonctionne, mais elle montre des applications supplémentaires qui ne gèrent pas nécessairement les e-mails (par exemple GDrive). Utiliser Intent.ACTION_SENDTOavec setType("text/plain")est le meilleur, mais vous devez ajouter setData(Uri.parse("mailto:"))pour obtenir les meilleurs résultats (uniquement les applications de messagerie). Le code complet est le suivant:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.setData(Uri.parse("mailto:[email protected]"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Email from My app");
intent.putExtra(Intent.EXTRA_TEXT, "Place your email message here ...");
startActivity(Intent.createChooser(intent, "Send Email"));
Rami Alloush
la source
Perfect soultion
Daxesh Vekariya
2

Si vous souhaitez cibler Gmail, vous pouvez procéder comme suit. Notez que l'intention est "ACTION_SENDTO" et non "ACTION_SEND" et les champs d'intention supplémentaires ne sont pas nécessaires pour Gmail.

String uriText =
    "mailto:[email protected]" + 
    "?subject=" + Uri.encode("your subject line here") + 
    "&body=" + Uri.encode("message body here");

Uri uri = Uri.parse(uriText);

Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
if (sendIntent.resolveActivity(getPackageManager()) != null) {
   startActivity(Intent.createChooser(sendIntent, "Send message")); 
}
pcodex
la source
2

Je mets à jour la réponse d'Adil dans Kotlin,

val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, Array(1) { "[email protected]" })
intent.putExtra(Intent.EXTRA_SUBJECT, "subject")
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    showSnackBar(getString(R.string.no_apps_found_to_send_mail), this)
}
Kishan Solanki
la source
Cela échoue même lorsque Gmail est sur l'application.
AndroidDev
@AndroidDev dans quel appareil vous rencontrez le problème?
Kishan Solanki
2

Veuillez utiliser le code ci-dessous:

                try {

                    String uriText =
                            "mailto:emailid" +
                                    "?subject=" + Uri.encode("Feedback for app") +
                                    "&body=" + Uri.encode(deviceInfo);
                    Uri uri = Uri.parse(uriText);
                    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
                    emailIntent.setData(uri);
                    startActivity(Intent.createChooser(emailIntent, "Send email using..."));
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(ContactUsActivity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
                }
Tushar Bapte
la source
1

Vous devriez peut-être essayer ceci: intent.setType("plain/text");

Je l'ai trouvé ici . Je l'ai utilisé dans mon application et il n'affiche que les options E-Mail et Gmail.

sianis
la source
2
"plain / text" affiche Bluetooth, Skype, etc. Vérifiez la sortie souhaitée dans l'application Android Market. Les étapes sont répertoriées dans la question.
dira
1
L'utilisation du type MIME pour effectuer une opération d'envoi est une mauvaise idée, car vous demandez essentiellement à Android de fournir une liste d'applications qui prennent en charge l'envoi d'un fichier de type plain/text, et ce n'est même pas un type MIME valide. Ce n'est pas la même chose que d'envoyer un e-mail. Utilisez mailto:plutôt le protocole, car c'est ce que les clients de messagerie comprennent réellement.
Paul Lammertsma
1

Composez un e-mail dans le client de messagerie du téléphone:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));

la source
1

Utilisez ceci:

boolean success = EmailIntentBuilder.from(activity)
        .to("[email protected]")
        .cc("[email protected]")
        .subject("Error report")
        .body(buildErrorReport())
        .start();

utilisez build gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
Manish
la source
1

C'est ce que j'utilise, et ça marche pour moi:

//variables
String subject = "Whatever subject you want";
String body = "Whatever text you want to put in the body";
String intentType = "text/html";
String mailToParse = "mailto:";

//start Intent
Intent variableName = new Intent(Intent.ACTION_SENDTO);
variableName.setType(intentType);
variableName.setData(Uri.parse(mailToParse));
variableName.putExtra(Intent.EXTRA_SUBJECT, subject);
variableName.putExtra(Intent.EXTRA_TEXT, body);

startActivity(variableName);

Cela permettra également à l'utilisateur de choisir son application de messagerie préférée. La seule chose que cela ne vous permet pas de faire est de définir l'adresse e-mail du destinataire.

sauterelle
la source
Il vous manque un "sur la 2e ligne.
Tim
1

Ce code fonctionne sur mon appareil

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"[email protected]"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));
Mahen
la source
il ouvre uniquement Gmail et Email dans mon appareil
Mahen
1
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", email, null));
if (emailIntent.resolveActivity(context.getPackageManager()) != null) {
    context.startActivity(Intent.createChooser(emailIntent, "Send Email..."));
} else {
    Toast.makeText(context, "No apps can perform this action.", Toast.LENGTH_SHORT).show();
}
Ahamadullah Saikat
la source