Android più allegati di posta elettronica utilizzando Intent


98

Ho lavorato al programma Android per inviare e-mail con un allegato (file immagine, file audio, ecc.) Utilizzando Intent con ACTION_SEND. Il programma funziona quando la posta elettronica ha un unico allegato. Ho usato Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)per allegare il file immagine designato alla posta e funziona bene, la posta può essere consegnata tramite Gmail. Tuttavia, quando ho provato ad allegare più immagini alla stessa posta chiamando Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)più volte, non ha funzionato. Nessuno degli allegati viene visualizzato nell'e-mail.

Ho cercato nella documentazione SDK e nel gruppo di utenti di programmazione Android sugli allegati di posta elettronica, ma non sono riuscito a trovare alcuna informazione correlata. Tuttavia, ho scoperto che esiste un'altra costante di intento ACTION_SEND_MULTIPLE(disponibile dal livello API 4) che potrebbe soddisfare i miei requisiti. Sulla base della documentazione SDK, afferma semplicemente che fornisce più dati a qualcun altro, funziona come ACTION_SEND, tranne che i dati sono multipli. Ma ancora non sono riuscito a capire l'utilizzo corretto di questo comando. Ho provato a dichiarare l'intento con ACTION_SEND_MULTIPLE, quindi chiamare putExtra(EXTRA_STREAM, uri)più volte per allegare più immagini, ma ho ottenuto lo stesso risultato errato proprio come prima, nessuno degli allegati viene visualizzato nell'e-mail.

Qualcuno ha provato ACTION_SEND_MULTIPLEe fatto funzionare con più allegati di posta elettronica?


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

Risposte:


187

Ecco il codice necessario per creare un messaggio di posta elettronica 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 inserire l'oggetto e il testo dell'email nell'intento. altrimenti grazie per il codice.
Bahadır Yağan

5
Il tipo di dati MIME corretto dovrebbe essere "text / plain" e non "plain / text": emailIntent.setType("text/plain");. Se utilizzi "plain / text" Android costringerà a utilizzare GMail come mittente, ma se utilizzi "text / plain" fornirà una finestra di dialogo per la selezione delle applicazioni con Gmail, Facebook, Bluetooth ecc. Se desideri proporre solo programmi di posta usa invece "text / xml".
Idolon

4
E se cambi l'ultima riga context.startActivity(emailIntent);nella casella di controllo "Usa per impostazione predefinita per questa azione" apparirà nella finestra di dialogo di selezione dell'applicazione, quindi l'utente sarà in grado di selezionare l'applicazione predefinita per l'invio di e-mail con più allegati.
Idolon

2
Questo esempio mi sta compensando una "AndroidRuntimeException: la chiamata a startActivity () dall'esterno di un contesto di attività richiede il flag FLAG_ACTIVITY_NEW_TASK. È davvero quello che vuoi?" Ho provato a passare sia l'applicazione che il contesto di base a questo metodo di posta elettronica ed entrambi hanno restituito lo stesso errore.
ravemir

Questo mi ha risolto, ma non sono sicuro di sfuggire a un errore in un modo strano, quindi lascio qui il commento precedente per chiunque ne abbia idea.
ravemir

29

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.


19

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

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

fileIn.setReadable(true, false)

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

Grazie amico! Non potrei fare le foto da inviare senza questa linea
konunger

WOW! questa risposta mi ha salvato totalmente la giornata. Se qualcuno riceve l'errore "uno o più file non allegati. Limite di 20 MB" dall'app Gmail, questa correzione risolve tutto. Il miglior consiglio di sempre!
belphegor


2

Per più allegati, usa PutParcelableArrayListExtra(Intent.ExtraStream, uris)dove la variabile uris è a 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 ti aiuti ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.