wake-up-neo.com

Verwenden von Android Intent.ACTION_SEND zum Senden von E-Mails

Ich verwende Intent.ACTION_SEND, um eine E-Mail zu senden. Wenn ich jedoch intent anrufe, werden Auswahlmöglichkeiten zum Senden einer Nachricht, zum Senden einer E-Mail sowie zum Senden über Bluetooth angezeigt. Ich möchte nur die Auswahlmöglichkeiten zum Senden einer E-Mail anzeigen. Wie kann ich das machen? 

25
Ganapathy C
Intent email = new Intent(Android.content.Intent.ACTION_SEND);  
                    email.setType("application/octet-stream");    

BEARBEITEN:
Sie können auch versuchen, den Typ auf "message/rfc822" einzustellen.

versuche dies.... 

23
N-JOY

@Ganapathy: Probieren Sie diesen Code für die Anzeige von Google Mail aus

Intent gmail = new Intent(Intent.ACTION_VIEW);
                gmail.setClassName("com.google.Android.gm","com.google.Android.gm.ComposeActivityGmail");
                gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
                gmail.setData(Uri.parse("[email protected]"));
                gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                gmail.setType("plain/text");
                gmail.putExtra(Intent.EXTRA_TEXT, "hi Android jack!");
                startActivity(gmail);
19
Jack Dsilva

Ich akzeptiere diese Antwort nicht, aber ich glaube, sie gibt die beste Antwort für diesen Beitrag.

Es ist ein weit verbreitetes Missverständnis, text/plain oder text/html zu verwenden. Dadurch wird jede Anwendung ausgelöst, die einfache oder HTML-Textdateien ohne Kontext verarbeiten kann, einschließlich Google Drive, Dropbox, Evernote und Skype.

Verwenden Sie stattdessen einen ACTION_SENDTO, der den mailto:-Uri bereitstellt

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));

Sie können dann mit dem Auswahlprogramm fortfahren, wie in den anderen Antworten vorgeschlagen.

Beantwortet von @PaulLammertsma hier Android E-Mail-Wahlhilfe

19
toobsco42

Das wird dir helfen.

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});          
email.putExtra(Intent.EXTRA_SUBJECT, "subject");
email.putExtra(Intent.EXTRA_TEXT, "message");
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
14
Jignesh Mayani

[Lösung für API LEVEL> = 15]

Ich habe es endlich geschafft, E-Mails zu versenden MIT Anhängen an NUR E-Mail-Clients . Ich schreibe es hier, weil es mich sehr viel Zeit gekostet hat und es für andere nützlich sein könnte.

Das Problem ist:

  • Intent.ACTION_SENDTO nimmt den Daten-URI (damit Sie "mailto:" Schema angeben können), ABER es akzeptiert nicht Intent: EXTRA_STREAM.

  • Intent.ACTION_SEND akzeptiert Intent: EXTRA_STREAM (damit können Sie Anhang hinzufügen.) ABER es wird nur Type (nicht Daten-URI) benötigt, daher können Sie nicht "Mailto:" - Schema angeben.

Mit Intent.ACTION_SEND kann der Benutzer also aus mehreren Aktivitäten wählen, auch wenn setType ("message/rfc822") gesetzt ist, da diese App/Activities alle Dateitypen (typischerweise GDrive/Dropbox-Apps) und sogar E-Mail-Nachrichtendateien verwalten kann.

Die Lösung befindet sich in der setSelector-Methode ..__ Mit dieser Methode können Sie Intent.ACTION_SENDTO verwenden, um die Aktivität auszuwählen, aber dann den Intent.ACTION_SEND-Intent zu senden.

Hier mein Lösungscode (der Anhang stammt von einem FileProvider, es könnte jedoch eine beliebige Datei sein):

{
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
    emailSelectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    emailIntent.setSelector( emailSelectorIntent );

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile);
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment);

    if( emailIntent.resolveActivity(getPackageManager()) != null )
        startActivity(emailIntent);
}
12
ARLabs

Verwenden Sie message/rfc822-Typ wie hier gezeigt: ACTION_SEND erzwingt das Senden mit E-Mail löst das Problem.

7
Gawcio

Ich hatte ein ähnliches Problem mit meiner App. Ich fand diesen Link vor kurzem von der offiziellen Android-Entwicklerseite, die wirklich hilft! Gemeinsame Absichten: E-Mail

TL; DR: 

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));

Jetzt werden Ihnen nur E-Mail-Clients angezeigt!

Sie können einen Betreff und einen Text hinzufügen, indem Sie Folgendes tun: 

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body" );
6
Avi Parshan

Ich stelle fest, dass dies eine ziemlich alte Frage ist, aber es ist das erste Ergebnis bei der Suche nach einer "Mail senden" -Lösung, und alle Antworten haben ein gemeinsames Problem:

Die Verwendung von Intent.ACTION_SEND und intent.setType("message/rfc822") führt zu einer Auswahl, die nicht nur Mail-Apps, sondern alle Apps anzeigt, die any MIME-Typ-Unterstützung von message/rfc822 unterstützen können, z. .mhtml, .mht, .mime. Neben Mail-Apps könnten dies Google Drive, Dropbox, Evernote usw. sein

Die einzige Lösung, die ich gefunden habe, um die Auswahl auf E-Mail-Apps zu beschränken, besteht darin, stattdessen Intent.ACTION_SENDTO zu verwenden:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail");
intent.putExtra(Intent.EXTRA_TEXT   , "My Message");

try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (Android.content.ActivityNotFoundException ex) {
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
3
Andrei Herford

Erste Lösung: Versuchen Sie, Ihre Intent-Parameter genauer zu definieren. Fügen Sie beispielsweise einen Nachrichtenempfänger hinzu 

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

Zweite Lösung: Verwenden Sie den package manager , um alle Anwendungen zu finden, die eine Nachricht senden können.

2
Jcs

Dies ist eine Kombination von Jack Dsilva und Jignesh Mayani-Lösungen:

    try
    {
        Intent gmailIntent = new Intent(Intent.ACTION_SEND);
        gmailIntent.setType("text/html");

        final PackageManager pm = _activity.getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0);
        String gmailActivityClass = null;

        for (final ResolveInfo info : matches)
        {
            if (info.activityInfo.packageName.equals("com.google.Android.gm"))
            {
                gmailActivityClass = info.activityInfo.name;

                if (gmailActivityClass != null && !gmailActivityClass.isEmpty())
                {
                    break;
                }
            }
        }

        gmailIntent.setClassName("com.google.Android.gm", gmailActivityClass);
        gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message");
        gmailIntent.setData(Uri.parse("[email protected]"));
        this._activity.startActivity(gmailIntent);
    }

    catch (Exception e)
    {
        Intent i = new Intent(Intent.ACTION_SEND);
        i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        i.putExtra(Intent.EXTRA_TEXT, "Email message");
        i.setType("plain/text");
        this._activity.startActivity(i);
    }

Zunächst wird also versucht, die Google Mail-App zu öffnen. Falls ein Benutzer dies nicht hat, wird der zweite Ansatz implementiert.

0
Sa Qada

Bester Code, um zu beschränken, dass nur eine E-Mail gesendet wird. Stellen Sie diesen Typ so ein, dass nur E-Mails gesendet werden. i.setType("message/rfc822");

        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"[email protected]"});
        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(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
        }
0
Xar E Ahmer

Das hat meinen Tag gerettet. Es sendet eine zusammengesetzte SMS direkt an die Google Mail-App:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                        "mailto","togmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message");
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString());
startActivity(Intent.createChooser(emailIntent, "Send email..."));
0
Kristene