2010-07-22 3 views
65

Ich möchte einen Teil meiner Anwendung einrichten, mit dem Benutzer eine schnelle E-Mail an einen anderen Benutzer senden können. Es ist nicht sehr schwer, dies einzurichten:Öffnen von E-Mail-Programmen über Intents (aber nur ein E-Mail-Programm)

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

jedoch das Problem, dass der ACTION_SEND um mehr als E-Mail nur Programme akzeptiert wird - zum Beispiel auf meinem Handy des Facebook-App, Twitter, reddit ist Spaß, und Sogar Bluetooth bietet sich als brauchbare Alternative zum Senden dieser Nachricht an. Die Nachricht ist für einige von diesen (besonders Twitter) völlig zu lang.

Gibt es eine Möglichkeit, die Auswahl auf Anwendungen zu beschränken, die lange Nachrichten (z. B. E-Mail) unterstützen? Oder gibt es eine Möglichkeit, die App, die der Benutzer ausgewählt hat, zu erkennen und die Nachricht entsprechend anzupassen?

+2

Ich frage mich, wie Linkify-Klasse entscheidet, was für Mailto-Links zu öffnen. Überprüfen Sie vielleicht den Quellcode von Linkify und veröffentlichen Sie Ihre Ergebnisse. – Pentium10

+0

Guter Anruf - Ich werde das überprüfen und Sie wissen lassen, ob ich etwas Interessantes finde. –

+0

Danke nochmal Pentium10, guter Vorschlag zum Nachschlagen, wie Linkify Dinge macht. –

Antwort

77

Ändern der MIME-Typ ändert, ist die Antwort, das ist, was ich in meiner app tat das gleiche Verhalten zu ändern.Ich benutzte intent.setType("message/rfc822");

+1

Ich würde nicht davon ausgehen, dass jedes E-Mail-Programm diesen MIME-Typ unterstützt. – CommonsWare

+2

In meinem Gerät listet Google Mail, aber auch "Drive" und "AndFTP" – auval

+9

ich neue Absicht (Intent.ACTION_SENDTO, Uri.parse ("mailto:")); –

4

Haben Sie versucht, einschließlich der Intent.EXTRA_EMAIL extra?

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

, dass die Liste der verfügbaren Empfänger-Anwendungen einschränken ...

+2

Ich habe das versucht, hilft nicht. Extras werden nicht zum Filtern der Apps in einer Auswahl verwendet. –

+0

Ich denke, die einzige andere Lösung wäre, ein bestimmtes Mailprogramm zu starten, indem man einen String mit seinem vollständigen Klassen-/Paketpfad übergibt. Dies würde Ihre Benutzer auf eine Mail-App beschränken, würde aber andere Arten von Apps (wie Twitter) davon abhalten, Optionen zu sein ... – idolize

+1

Ich mag diese Idee überhaupt nicht, weil die meisten Benutzer zwei Standard-Mail-Apps haben (die Standard-Mail-App und Google Mail), und ich möchte nicht erraten, welche sie verwenden. –

79

Dank Pentium10 Vorschlag der Suche, wie man Linkify funktioniert, ich habe eine große Lösung für dieses Problem gefunden. Grundsätzlich erstellen Sie nur einen „mailto:“ -Link, und rufen Sie dann die entsprechende Absicht für das .:

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

Es gibt ein paar interessante Aspekte zu dieser Lösung:

  1. Ich verwende die ACTION_VIEW-Aktion, da dies für einen Link "mailto:" besser geeignet ist. Sie könnten keine bestimmten Aktionen durchführen, aber dann könnten Sie einige unbefriedigende Ergebnisse erhalten (z. B. werden Sie gefragt, ob Sie den Link zu Ihren Kontakten hinzufügen möchten).

  2. Da dies ein "share" -Link ist, schließe ich einfach keine E-Mail-Adresse ein - obwohl dies ein mailto-Link ist. Es klappt.

  3. Es gibt keine Auswahl. Der Grund dafür ist, dass der Benutzer die Standardeinstellungen nutzen kann. Wenn sie ein Standard-E-Mail-Programm eingestellt haben, dann werden sie es direkt angehen, indem sie den Chooser ganz umgehen (was meiner Meinung nach gut ist, können Sie anders argumentieren).

Natürlich gibt es eine Menge Finesse Ich verlasse aus (wie richtig das Thema/Körper-Codierung), aber Sie sollten auf eigene Faust herausfinden können.

+0

Von all der Lösung um es funktioniert für mich Danke Freund :) – Bora

+2

Dies ist die beste Methode imo, weil es Snapchat, Telegram und andere apps nicht zeigt, die das Senden von Text erlauben – WuerfelDev

+3

In Fällen, wenn jemand braucht, Sie Empfänger mit "& an " – Umarov

0

Versuchen Sie den MIME-Typ von schlicht bis Nachricht

intent.setType("text/message"); 
1

Dies ist ein bisschen wie ein Tippfehler, da Sie Ihre MIME-Typ wechseln müssen:

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

Dieser arbeitete für mich

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[] {"[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...")); 
+1

Funktioniert gut. Ich mag die CreateChooser-Methode .. danke .. – jheneghan

+1

Arbeitete wie ein Charme .. Beachten Sie besonders, dass die Extra_Email im String-Array sein sollte, oder das An: wird leer sein ... – Nilesh

0

versuchen, diese Option:

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