2010-02-15 6 views
93

Ich habe an Android-Programm zum Senden von E-Mails mit einem Anhang (Bilddatei, Audiodatei, etc.) mit Intent mit ACTION_SEND gearbeitet. Das Programm funktioniert, wenn E-Mail einen einzigen Anhang hat. Ich habe verwendet, um die angegebene Bilddatei an die E-Mail anzuhängen, und es funktioniert einwandfrei, die E-Mail kann über Google Mail zugestellt werden. Als ich jedoch versucht habe, mehrere Bilder an die gleiche E-Mail anzuhängen, indem ich mehrmals aufruft, funktioniert es nicht. Keiner der Anhänge wird in der E-Mail angezeigt.Android mehrere E-Mail-Anhänge mit Intent

Ich suchte die SDK-Dokumentation und Android-Programmierung Benutzergruppe über E-Mail-Anhang, kann aber keine verwandten Informationen finden. Ich habe jedoch festgestellt, dass es eine weitere Intent-Konstante ACTION_SEND_MULTIPLE (verfügbar seit API Level 4) gibt, die möglicherweise meine Anforderung erfüllt. Basierend auf der SDK-Dokumentation heißt es einfach, dass es mehrere Daten an jemand anderen liefert, es funktioniert wie ACTION_SEND, außer dass die Daten mehrfach sind. Aber ich konnte immer noch nicht die richtige Verwendung für diesen Befehl herausfinden. Ich habe versucht, Absicht mit ACTION_SEND_MULTIPLE zu erklären, dann putExtra(EXTRA_STREAM, uri) mehrere Male anzuhängen, um mehrere Bilder anzuhängen, aber ich habe das gleiche fehlerhafte Ergebnis genau wie vorher, keiner der Anlage erscheint in der E-Mail.

Hat jemand versucht mit ACTION_SEND_MULTIPLE und hat es funktioniert mit mehreren E-Mail-Anhang?

+0

Ich habe das gleiche Problem. Es funktioniert nicht. Das gleiche Problem besteht beim Senden von MMS, es besteht die Möglichkeit, nur eine Datei hinzuzufügen. Hast du die Ideen dazu anders? –

Antwort

176

Hier ist der Code, den Sie eine emailIntent erstellen müssen verwenden müssen, die mehrere Anlagen 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

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

+5

Der richtige MIME-Datentyp sollte "text/plain" und nicht "plain/text" sein: 'emailIntent.setType (" text/plain ");'.Wenn Sie "plain/text" verwenden, wird Android die Verwendung von Google Mail als Absender erzwingen. Wenn Sie jedoch "text/plain" verwenden, wird ein Dialog für die Anwendungsauswahl mit Google Mail, Facebook, Bluetooth usw. bereitgestellt. Wenn Sie nur E-Mail-Programme vorschlagen möchten Verwenden Sie stattdessen "text/xml". – Idolon

+4

Und wenn Sie die letzte Zeile in 'context.startActivity (emailIntent) ändern,' wird das Kontrollkästchen "Standardmäßig für diese Aktion verwenden" im Anwendungsauswahldialog angezeigt, damit der Benutzer die Standardanwendung zum Senden der E-Mails auswählen kann mehrere Anhänge. – Idolon

24

ACTION_SEND_MULTIPLE sollte die Aktion

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

Dies funktioniert für mich.

17

Obwohl dies ein alter Thread ist, aber wie es bei Google-Suchen oben angezeigt wird, möchte ich einen kleinen Hinweis hinzufügen, um es zu vervollständigen, daher stolperte ich darauf.

Es ist notwendig, die angehängten Dateien für die Mail-Aktivität lesbar zu machen, andernfalls werden sie nicht angehängt. So müssen Sie rufen irgendwo

fileIn.setReadable(true, false) 
+0

Vielen Dank Sir, die Mail konnte die Anhänge nur mit der Mail versenden. – Josejulio

+0

Danke, Mann! Ich konnte die Bilder nicht ohne diese Linie schicken – konunger

+0

WOW! Diese Antwort hat meinen Tag gerettet. Wenn jemand den Fehler "Eine oder mehrere Dateien nicht angehängt. Limit 20mb" von der Google Mail-App erhält, löst dieser Fix alles. Der beste Tipp aller Zeiten! – belphegor

1

Für mehrere Anlagen verwenden PutParcelableArrayListExtra(Intent.ExtraStream, uris) wo uris Variable ist ein 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...")); 

this helps;)

+0

Vielen Dank für diesen Code! :) – sha