Android mehrere E-Mail-Anhänge mit Intent

98

Ich habe an einem Android-Programm gearbeitet, um E-Mails mit einem Anhang (Bilddatei, Audiodatei usw.) mit Intent with zu senden ACTION_SEND. Das Programm funktioniert, wenn E-Mails einen einzelnen Anhang haben. Ich habe Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)die angegebene Bilddatei an die E-Mail angehängt und sie funktioniert einwandfrei. Die E-Mail kann über Google Mail zugestellt werden. Als ich jedoch versuchte, mehrere Bilder durch Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)mehrmaliges Aufrufen an dieselbe E-Mail anzuhängen , funktionierte dies nicht. Keiner der Anhänge wird in der E-Mail angezeigt.

Ich habe die Benutzergruppe SDK-Dokumentation und Android-Programmierung nach E-Mail-Anhängen durchsucht, kann jedoch keine verwandten Informationen finden. Ich habe jedoch festgestellt, dass es eine andere Absichtskonstante gibt ACTION_SEND_MULTIPLE(verfügbar seit API-Stufe 4), die möglicherweise meine Anforderungen erfüllt. Basierend auf der SDK-Dokumentation wird lediglich angegeben, dass mehrere Daten an eine andere Person gesendet werden. Dies funktioniert wie ACTION_SEND, außer dass die Daten mehrere sind. Aber ich konnte immer noch nicht die richtige Verwendung für diesen Befehl herausfinden. Ich habe versucht, die Absicht mit zu erklären ACTION_SEND_MULTIPLEund dann putExtra(EXTRA_STREAM, uri)mehrmals anzurufen , um mehrere Bilder anzuhängen, aber ich habe das gleiche fehlerhafte Ergebnis wie zuvor erhalten. Keiner der Anhänge wird in der E-Mail angezeigt.

Hat jemand versucht, ACTION_SEND_MULTIPLEes mit mehreren E-Mail-Anhängen zum Laufen zu bringen?

JJJJ1234
quelle
Ich habe das gleiche Problem. Es funktioniert nicht mit Code. Das gleiche Problem besteht beim Senden von MMS. Es besteht die Möglichkeit, nur eine Datei hinzuzufügen. Haben Sie einige Ideen dazu auf andere Weise?

Antworten:

187

Hier ist der Code, den Sie zum Erstellen eines emailIntent benötigen, 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..."));
}
gregm
quelle
2
Sie haben vergessen, den Betreff und den E-Mail-Text der Absicht zuzuordnen. Ansonsten danke für den Code.
Bahadır Yağan
5
Der richtige MIME-Datentyp sollte "text / plain" und nicht "plain / text" sein : emailIntent.setType("text/plain");. Wenn Sie "Klartext / Text" verwenden, erzwingt Android die Verwendung von GMail als Absender. Wenn Sie jedoch "Text / Klartext" verwenden, wird ein Dialogfeld zur Anwendungsauswahl mit Google Mail, Facebook, Bluetooth usw. angezeigt. Wenn Sie nur E-Mail-Programme vorschlagen möchten Verwenden Sie stattdessen "text / xml".
Idolon
4
Wenn Sie die letzte Zeile in context.startActivity(emailIntent);das Kontrollkästchen "Standardmäßig für diese Aktion verwenden" ändern, wird im Dialogfeld "Anwendungsauswahl" angezeigt, sodass der Benutzer die Standardanwendung zum Senden der E-Mails mit mehreren Anhängen auswählen kann.
Idolon
2
In diesem Beispiel wird mir eine "AndroidRuntimeException: Für den Aufruf von startActivity () von außerhalb eines Aktivitätskontexts wird das Flag FLAG_ACTIVITY_NEW_TASK benötigt. Ist dies wirklich das, was Sie wollen?" Ich habe versucht, sowohl den Anwendungs- als auch den Basiskontext an diese E-Mail-Methode zu übergeben, und beide führen zu demselben Fehler.
Ravemir
Dies hat es für mich gelöst, aber ich bin mir nicht sicher, ob ich einem Fehler auf seltsame Weise entkomme. Deshalb werde ich den vorherigen Kommentar hier jedem hinterlassen, der eine Idee dazu hat.
Ravemir
29

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.

Santhana
quelle
19

Dies ist zwar ein alter Thread, aber da er bei Google-Suchanfragen oben angezeigt wird, möchte ich einen kleinen Hinweis hinzufügen, um ihn zu vervollständigen. Daher bin ich darauf gestoßen.

Es ist erforderlich, die angehängten Dateien für die E-Mail-Aktivität lesbar zu machen, da sie sonst nicht angehängt werden. Also musst du irgendwo anrufen

fileIn.setReadable(true, false)
Thomas
quelle
Vielen Dank, Sir, die Mail konnte die Anhänge nicht nur die Mail senden.
Josejulio
Danke mann! Ich könnte die Bilder nicht ohne diese Zeile
senden lassen
BEEINDRUCKEND! Diese Antwort hat mir den Tag total gerettet. Wenn jemand von der Google Mail-App den Fehler "Eine oder mehrere Dateien nicht angehängt. Limit 20 MB" erhält, löst dieses Update alles. Bester Tipp aller Zeiten!
Belphegor
18

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

Sie müssen verwenden

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

Verwenden PutParcelableArrayListExtra(Intent.ExtraStream, uris)Sie für mehrere Anhänge, wenn die Variable uris eine ist. List<IParcelable>(). Hier 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..."));

Hoffe das hilft ;)

Michele Caggiano
quelle