80 votes

Comment ouvrir un programme de messagerie via Intents (mais uniquement un programme de messagerie)

Je souhaite l'installation d'une partie de mon application qui permet aux utilisateurs d'envoyer un e-mail à un autre utilisateur. Ce n'est pas très difficile de le définir:

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 le ACTION_SEND est acceptée par plus que juste des programmes d'e-mail - par exemple, sur mon téléphone le Facebook app, Twitter, reddit est un plaisir, et même Bluetooth comme des solutions de rechange viables pour l'envoi de ce message. Le message est beaucoup trop long pour certains (surtout sur Twitter).

Est-il un moyen de limiter le sélecteur, juste des applications qui prennent en charge les longs messages (comme l'e-mail)? Ou est-il un moyen de détecter l'application que l'utilisateur a choisi et adapter le message de façon appropriée?

96voto

Daniel Lew Points 39063

Grâce à Pentium10 de suggestion de recherche comment Linkify, j'ai trouvé une excellente solution à ce problème. Fondamentalement, il vous suffit de créer un "mailto:" le lien, et ensuite appeler le Intention pour que.:

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 de cette solution:

  1. Je suis à l'aide de la ACTION_VIEW d'action parce que c'est plus approprié pour un "mailto:" lien. Vous pouvez fournir aucune action particulière, mais alors vous pourriez obtenir quelques résultats insatisfaisants (par exemple, il vous demandera si vous souhaitez ajouter le lien à vos contacts).

  2. Puisque c'est un lien "partager", je suis simplement en incluant pas d'adresse e - mail- même si c'est un lien mailto. Elle fonctionne.

  3. Il n'y a pas de sélecteur de cause. La raison pour cela est de permettre à l'utilisateur de profiter des valeurs par défaut; si ils ont défini un programme de messagerie par défaut, puis il va les prendre directement en contournant le sélecteur de tout (ce qui semble bon dans mon esprit, vous pouvez soutenir le contraire).

Bien sûr, il y a beaucoup de finesse je pars (comme correctement l'encodage de l'objet/corps), mais vous devriez être capable de trouver sur votre propre.

86voto

Jeff S Points 1815

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

29voto

hrehman Points 734

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 String[] {"abc@xyz.com"});
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..."));
 

4voto

idolize Points 1804

Avez-vous essayé d'inclure les Intent.EXTRA_EMAIL supplémentaires?

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

Cela peut limiter la liste des applications de récepteur disponibles ...

0voto

Peterdk Points 4848

C'est un peu une faute de frappe, car vous devez changer votre type MIME:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X