101 Stimmen

Android mehrere E-Mail-Anhänge mit Intent

Ich habe an einem Android-Programm gearbeitet, um eine E-Mail mit einem Anhang (Bilddatei, Audiodatei, etc.) zu versenden, indem ich Intent mit ACTION_SEND . Das Programm funktioniert, wenn die E-Mail einen einzigen Anhang hat. Ich habe Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) um die gewünschte Bilddatei an die E-Mail anzuhängen, und es funktioniert einwandfrei, die E-Mail kann über Gmail zugestellt werden. Als ich jedoch versuchte, mehrere Bilder an dieselbe E-Mail anzuhängen, indem ich Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) mehrere Male, aber es hat nicht funktioniert. Keiner der Anhänge taucht in der E-Mail auf.

Ich habe die SDK-Dokumentation und die Android-Programmier-Benutzergruppe zum Thema E-Mail-Anhang durchsucht, kann aber keine entsprechenden Informationen finden. Allerdings habe ich entdeckt, dass es eine andere Absicht Konstante ACTION_SEND_MULTIPLE (verfügbar seit API-Stufe 4), die meine Anforderungen erfüllen könnte. In der SDK-Dokumentation heißt es einfach, dass mehrere Daten an eine andere Person übermittelt werden, was wie folgt funktioniert ACTION_SEND mit dem Unterschied, dass die Daten mehrfach vorhanden sind. Aber ich konnte immer noch nicht herausfinden, wie man diesen Befehl richtig verwendet. Ich habe versucht, die Absicht zu deklarieren mit ACTION_SEND_MULTIPLE und rufen dann putExtra(EXTRA_STREAM, uri) Ich habe mehrere Male versucht, mehrere Bilder anzuhängen, aber ich habe dasselbe fehlerhafte Ergebnis erhalten wie zuvor: Keiner der Anhänge wird in der E-Mail angezeigt.

Hat jemand versucht, mit ACTION_SEND_MULTIPLE und es mit mehreren E-Mail-Anhängen zum Laufen gebracht?

0 Stimmen

Ich habe das gleiche Problem. Es funktioniert der Code nicht. Das gleiche Problem besteht beim Senden von MMS, es gibt die Möglichkeit, nur eine Datei hinzuzufügen. Haben Sie einige Ideen, um es auf eine andere Art und Weise?

189voto

gregm Punkte 11699

Hier ist der Code, den Sie benötigen, um einen emailIntent zu erstellen, der mehrere Anhänge enthält.

public static void email(Context context, String emailTo, String emailCC,
    String subject, String emailText, List<String> filePaths)
{
    //need to "send multiple" to get more than one attachment
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
        new String[]{emailTo});
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
        new String[]{emailCC});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
    //has to be an ArrayList
    ArrayList<Uri> uris = new ArrayList<Uri>();
    //convert from paths to Android friendly Parcelable Uri's
    for (String file : filePaths)
    {
        File fileIn = new File(file);
        Uri u = Uri.fromFile(fileIn);
        uris.add(u);
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}

2 Stimmen

Sie haben vergessen, den Betreff und den emailText in die Absicht zu setzen. Ansonsten danke für den Code.

5 Stimmen

Der richtige MIME-Datentyp sollte "text/plain" und nicht "plain/text" sein: emailIntent.setType("text/plain"); . Wenn Sie "plain/text" verwenden, zwingt Android Sie, GMail als Absender zu verwenden, aber wenn Sie "text/plain" verwenden, wird es einen Anwendungsauswahldialog mit Gmail, Facebook, Bluetooth usw. anbieten. Wenn Sie nur E-Mail-Programme vorschlagen möchten, verwenden Sie stattdessen "text/xml".

4 Stimmen

Und wenn Sie die letzte Zeile in context.startActivity(emailIntent); wird das Kontrollkästchen "Standardmäßig für diese Aktion verwenden" im Dialogfeld für die Anwendungsauswahl angezeigt, so dass der Benutzer die Standardanwendung für den Versand von E-Mails mit mehreren Anhängen auswählen kann.

31voto

santhana Punkte 311

ACTION_SEND_MULTIPLE sollte die Aktion sein

und dann emailIntent.setType("text/plain");

gefolgt von:

ArrayList<Uri> uris = new ArrayList<Uri>();
String[] filePaths = new String[] {"sdcard/sample.png", "sdcard/sample.png"};
for (String file : filePaths)
{
    File fileIn = new File(file);
    Uri u = Uri.fromFile(fileIn);
    uris.add(u);
}
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(emailIntent);

Das funktioniert bei mir.

20voto

thomas Punkte 265

Dies ist zwar ein altes Thema, aber da es bei der Google-Suche ganz oben angezeigt wird, möchte ich einen kleinen Hinweis hinzufügen, um es zu vervollständigen, daher bin ich darüber gestolpert.

Die angehängten Dateien müssen für die Mail-Aktivität lesbar sein, sonst werden sie nicht angehängt. Sie müssen also irgendwo aufrufen

fileIn.setReadable(true, false)

0 Stimmen

Danke, Sir, die Mail konnte die Anhänge nicht senden, nur die Mail.

0 Stimmen

Danke, Mann! Ich konnte nicht machen die Bilder ohne diese Zeile gesendet werden

0 Stimmen

WOW! Diese Antwort hat mir wirklich den Tag gerettet. Wenn jemand den Fehler "eine oder mehrere Dateien nicht angehängt. Limit 20mb" von der Google Mail App bekommt, löst diese Lösung alles. Der beste Tipp überhaupt!

18voto

printminion Punkte 2968

Hier habe ich ein tolles Beispiel gefunden http://www.blackmoonit.com/2010/02/filebrowser-send-receive-intents/

müssen Sie

final Intent aIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
aIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,theUris);
aIntent.setType(theOverallMIMEtype);

4voto

Michele Caggiano Punkte 285

Für mehrere Anhänge verwenden Sie PutParcelableArrayListExtra(Intent.ExtraStream, uris) wobei die Variable uris eine List<IParcelable>(). Hier ist ein Beispiel:

var email = new Intent(Intent.ActionSendMultiple);
    email.SetType("text/plain");
    email.PutExtra(Intent.ExtraEmail, new string[]{emailTo});
    email.PutExtra(Intent.ExtraCc, new string[]{emailCC});

    var uris = new List<IParcelable>();
    filePaths.ForEach(file=> {
        var fileIn = new File(file);
        var uri = Android.Net.Uri.FromFile(fileIn);
        uris.Add(uri);
    });

    email.PutParcelableArrayListExtra(Intent.ExtraStream, uris);

    context.StartActivity(Intent.CreateChooser(email, "Send mail..."));

Ich hoffe, das hilft ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X