2010-02-15 10 views
93

Ho lavorato al programma Android per inviare e-mail con un allegato (file immagine, file audio, ecc.) Utilizzando Intento con ACTION_SEND. Il programma funziona quando l'e-mail ha un singolo allegato. Ho utilizzato Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) per allegare il file di immagine designato alla posta e funziona correttamente, la posta può essere recapitata tramite Gmail. Tuttavia, quando ho provato ad avere più immagini collegate alla stessa mail chiamando più volte Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri), non funzionava. Nessuno degli allegati appare nell'e-mail.Allegati e-mail multipli di Android tramite Intento

Ho cercato la documentazione SDK e il gruppo di utenti di programmazione Android sull'allegato di posta elettronica ma non ho trovato alcuna informazione correlata. Tuttavia, ho scoperto che c'è un'altra costante di intenti ACTION_SEND_MULTIPLE (disponibile dal livello API 4) che potrebbe soddisfare il mio requisito. Basato sulla documentazione SDK, afferma semplicemente che fornisce dati multipli a qualcun altro, funziona come ACTION_SEND, eccetto che i dati sono multipli. Ma non riuscivo ancora a capire l'uso corretto di questo comando. Ho provato a dichiarare l'intenzione con ACTION_SEND_MULTIPLE, quindi chiamare più volte putExtra(EXTRA_STREAM, uri) per allegare più immagini, ma ho ottenuto lo stesso risultato errato proprio come prima, nessun allegato appare nell'e-mail.

Qualcuno ha provato con ACTION_SEND_MULTIPLE e ha funzionato con più allegati di posta elettronica?

+0

Ho lo stesso problema. Non funziona codice. Lo stesso problema esiste durante l'invio di MMS, c'è la possibilità di aggiungere solo un file. Avete qualche idea in un altro modo ?? –

risposta

176

Ecco il codice è necessario creare un emailIntent che contiene più allegati.

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

hai dimenticato di mettere l'oggetto e l'e-mailText all'intento. altrimenti grazie per il codice. –

+5

Il tipo di dati MIME corretto deve essere "text/plain" e non "plain/text": 'emailIntent.setType (" text/plain ");'.Se utilizzi "plain/text", Android imporrà l'utilizzo di GMail come mittente, ma se utilizzi "text/plain" fornirà la finestra di dialogo selettore di applicazioni con Gmail, Facebook, Bluetooth ecc. Se desideri proporre solo programmi di posta utilizzare invece "text/xml". – Idolon

+4

E se si modifica l'ultima riga in 'context.startActivity (emailIntent);' la casella di controllo "Usa per impostazione predefinita per questa azione" verrà visualizzata nella finestra di dialogo di selezione delle applicazioni, quindi l'utente sarà in grado di selezionare l'applicazione predefinita per l'invio delle e-mail con più allegati. – Idolon

24

ACTION_SEND_MULTIPLE dovrebbe essere l'azione

e poi emailIntent.setType("text/plain");

seguito da:

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

Questo funziona per me.

17

Anche se questo è un thread vecchio, ma come viene mostrato in alto nelle ricerche su google voglio aggiungere un piccolo suggerimento per completarlo, quindi mi sono accasciato su di esso.

È necessario rendere leggibili i file allegati per l'attività di posta, altrimenti non verranno allegati. Quindi bisogna chiamare qualche

fileIn.setReadable(true, false) 
+0

Grazie signore, la posta non è stata in grado di inviare agli allegati solo la posta. – Josejulio

+0

Grazie, amico! Non potrei fare le immagini per essere spedito senza questa linea – konunger

+0

WOW! questa risposta ha totalmente salvato la mia giornata. Se qualcuno riceve un errore "uno o più file non limitati. Limit 20mb" dall'app gmail, questa correzione risolve tutto. Il miglior consiglio di sempre! – belphegor

1

Per più allegati utilizzare PutParcelableArrayListExtra(Intent.ExtraStream, uris) dove variabile URI è una List<IParcelable>(). Ecco un esempio:

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

Spero che questo aiuti;)

+0

Grazie mille per questo codice! :) – sha

Problemi correlati