Comment ouvrir le programme Email via Intents (mais uniquement un programme Email)

Je veux configurer une partie de mon application qui permet aux utilisateurs d’envoyer un email rapide à un autre utilisateur. Ce n’est pas très difficile de mettre ça en place:

Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_TEXT, message); Intent mailer = Intent.createChooser(intent, null); startActivity(mailer); 

Cependant, le problème est que ACTION_SEND est accepté par bien plus que les programmes de messagerie – par exemple, sur mon téléphone, l’application Facebook, Twitter, reddit sont amusants et même Bluetooth apparaît comme une alternative viable pour envoyer ce message. Le message est trop long pour certains d’entre eux (notamment Twitter).

Existe-t-il un moyen de limiter le choix aux applications qui prennent en charge des messages longs (tels que le courrier électronique)? Ou existe-t-il un moyen de détecter l’application choisie par l’utilisateur et d’ajuster le message de manière appropriée?

Changer le type MIME est la réponse, c’est ce que j’ai fait dans mon application pour changer le même comportement. J’ai utilisé intent.setType("message/rfc822");

Grâce à la suggestion de Pentium10 de rechercher comment fonctionne Linkify, j’ai trouvé une excellente solution à ce problème. Fondamentalement, il vous suffit de créer un lien “mailto:”, puis d’appeler l’intention appropriée pour cela:

 Intent intent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body); intent.setData(data); startActivity(intent); 

Il y a quelques aspects intéressants à cette solution:

  1. J’utilise l’action ACTION_VIEW car c’est plus approprié pour un lien “mailto:”. Vous ne pouvez fournir aucune action particulière, mais vous risquez d’obtenir des résultats insatisfaisants (par exemple, il vous demandera si vous souhaitez append le lien à vos contacts).

  2. Puisqu’il s’agit d’un lien de “partage”, je n’inclus simplement aucune adresse e-mail – même s’il s’agit d’un lien mailto. Ça marche.

  3. Il n’y a pas de sélecteur impliqué. La raison en est que l’utilisateur peut tirer parti des valeurs par défaut. si elles ont défini un programme de messagerie par défaut, alors cela les amènera directement à cela, en contournant complètement le sélecteur (ce qui semble bon dans ma tête, vous pourriez le dire autrement).

Bien sûr, je laisse de côté beaucoup de finesse (comme encoder correctement le sujet / corps), mais vous devriez être capable de le comprendre vous-même.

Cela a fonctionné pour moi

 Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); emailIntent.setType("vnd.android.cursor.item/email"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new Ssortingng[] {"[email protected]"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content"); startActivity(Intent.createChooser(emailIntent, "Send mail using...")); 

Avez-vous essayé d’inclure le supplément Intent.EXTRA_EMAIL ?

 Intent mailer = new Intent(Intent.ACTION_SEND); mailer.setType("text/plain"); mailer.putExtra(Intent.EXTRA_EMAIL, new Ssortingng[]{"[email protected]"}); mailer.putExtra(Intent.EXTRA_SUBJECT, subject); mailer.putExtra(Intent.EXTRA_TEXT, bodyText); startActivity(Intent.createChooser(mailer, "Send email...")); 

Cela peut restreindre la liste des applications de récepteur disponibles …

Ceci est un peu une faute de frappe, puisque vous devez changer votre type MIME:

 intent.setType("plain/text"); //Instead of "text/plain" 

Essayez de changer le type MIME de plain en message

 intent.setType("text/message"); 

essayez cette option:

 Intent intentEmail = new Intent(Intent.ACTION_SEND); intentEmail.setType("message/rfc822"); 

Cela a parfaitement fonctionné pour moi. ici vous n’utilisez pas android.content.Intent.ACTION_SEND mais Intent.ACTION_VIEW

 Intent testIntent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "[email protected]"); testIntent.setData(data); startActivity(testIntent);