Ich entwickle eine Anwendung in Android. Ich weiß nicht, wie ich eine E-Mail aus der Anwendung heraus senden kann?
Antworten
Zu viele Anzeigen?Der beste (und einfachste) Weg ist die Verwendung einer Intent
:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
i.putExtra(Intent.EXTRA_TEXT , "body of email");
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
Andernfalls müssen Sie Ihren eigenen Client schreiben.
Ich benutze das Programm schon seit langer Zeit und es scheint gut zu sein, keine Nicht-E-Mail-Anwendungen werden angezeigt. Nur ein weiterer Weg, um eine E-Mail senden Absicht zu senden:
Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com")); // or just "mailto:" for blank
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app.
startActivity(intent);
Ich habe etwas Ähnliches wie die derzeit akzeptierte Antwort verwendet, um E-Mails mit einer angehängten binären Fehlerprotokolldatei zu versenden. GMail und K-9 senden sie problemlos und sie kommt auch auf meinem Mailserver gut an. Das einzige Problem war mein bevorzugter Mail-Client Thunderbird, der Probleme mit dem Öffnen/Speichern der angehängten Protokolldatei hatte. Tatsächlich speicherte er die Datei einfach nicht, ohne sich zu beschweren.
Ich habe mir den Quellcode einer dieser Mails angesehen und festgestellt, dass der Anhang der Protokolldatei (verständlicherweise) den Mime-Typ message/rfc822
. Natürlich ist dieser Anhang keine angehängte E-Mail. Aber Thunderbird kommt mit diesem kleinen Fehler nicht zurecht. Das war also ein ziemlicher Reinfall.
Nach einigen Recherchen und Experimenten bin ich auf folgende Lösung gekommen:
public Intent createEmailOnlyChooserIntent(Intent source,
CharSequence chooserTitle) {
Stack<Intent> intents = new Stack<Intent>();
Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
"info@domain.com", null));
List<ResolveInfo> activities = getPackageManager()
.queryIntentActivities(i, 0);
for(ResolveInfo ri : activities) {
Intent target = new Intent(source);
target.setPackage(ri.activityInfo.packageName);
intents.add(target);
}
if(!intents.isEmpty()) {
Intent chooserIntent = Intent.createChooser(intents.remove(0),
chooserTitle);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
intents.toArray(new Parcelable[intents.size()]));
return chooserIntent;
} else {
return Intent.createChooser(source, chooserTitle);
}
}
Es kann wie folgt verwendet werden:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] {
ANDROID_SUPPORT_EMAIL
});
i.putExtra(Intent.EXTRA_SUBJECT, "Crash report");
i.putExtra(Intent.EXTRA_TEXT, "Some crash report details");
startActivity(createEmailOnlyChooserIntent(i, "Send via email"));
Wie Sie sehen, kann die createEmailOnlyChooserIntent-Methode einfach mit dem richtigen Intent und dem richtigen Mime-Typ gefüttert werden.
Anschließend wird die Liste der verfügbaren Aktivitäten durchlaufen, die auf eine ACTION_SENDTO mailto
Protokoll-Intent (die nur E-Mail-Anwendungen sind) und erstellt eine Auswahl auf der Grundlage dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Intent mit dem richtigen Mime-Typ.
Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt ist (das zufällig auf den Mime-Typ rfc822 reagiert).
A E-MAIL-ANWENDUNGEN EINFACH ZULASSEN um Ihre Absicht zu lösen, müssen Sie ACTION_SENDTO als Aktion und mailto als Daten angeben.
private void sendEmail(){
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com")); // You can use "mailto:" if you don't know the address beforehand.
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body");
try {
startActivity(Intent.createChooser(emailIntent, "Send email using..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}
}
- See previous answers
- Weitere Antworten anzeigen