Pièces jointes à plusieurs e-mails Android utilisant Intent

98

J'ai travaillé sur un programme Android pour envoyer un e-mail avec une pièce jointe (fichier image, fichier audio, etc.) en utilisant Intent avec ACTION_SEND. Le programme fonctionne lorsque l'e-mail contient une seule pièce jointe. J'avais l'habitude Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)de joindre le fichier image désigné au courrier et cela fonctionne bien, le courrier peut être livré via Gmail. Cependant, lorsque j'ai essayé d'avoir plusieurs images jointes au même courrier en appelant Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)plusieurs fois, cela n'a pas fonctionné. Aucune des pièces jointes n'apparaît dans l'e-mail.

J'ai recherché la documentation du SDK et le groupe d'utilisateurs de programmation Android sur les pièces jointes aux e-mails, mais je ne trouve aucune information connexe. Cependant, j'ai découvert qu'il existe une autre constante d'intention ACTION_SEND_MULTIPLE(disponible depuis le niveau d'API 4) qui pourrait répondre à mes besoins. Sur la base de la documentation du SDK, il indique simplement qu'il fournit plusieurs données à quelqu'un d'autre, cela fonctionne comme ACTION_SEND, sauf que les données sont multiples. Mais je ne pouvais toujours pas comprendre l'utilisation correcte de cette commande. J'ai essayé de déclarer l'intention avec ACTION_SEND_MULTIPLE, puis d'appeler putExtra(EXTRA_STREAM, uri)plusieurs fois pour joindre plusieurs images, mais j'ai obtenu le même résultat erroné que précédemment, aucune pièce jointe n'apparaît dans l'e-mail.

Quelqu'un a-t-il essayé ACTION_SEND_MULTIPLEet fait fonctionner plusieurs pièces jointes?

aaaa1234
la source
J'ai le même problème. Ce n'est pas du code qui fonctionne. Le même problème existe lors de l'envoi de MMS, il est possible d'ajouter un seul fichier. Avez-vous des idées d'une autre manière ??

Réponses:

187

Voici le code dont vous avez besoin pour créer un emailIntent contenant plusieurs pièces jointes.

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
la source
2
vous avez oublié de mettre le sujet et l'emailText dans l'intention. sinon merci pour le code.
Bahadır Yağan
5
Le type de données MIME correct devrait être "text / plain" et non "clair / texte": emailIntent.setType("text/plain");. Si vous utilisez "plain / text" Android forcera à utiliser GMail comme expéditeur, mais si vous utilisez "text / plain", il fournira un dialogue de sélection d'application avec Gmail, Facebook, Bluetooth etc. Si vous souhaitez proposer uniquement des programmes de messagerie utilisez plutôt "text / xml".
Idolon
4
Et si vous remplacez la dernière ligne par context.startActivity(emailIntent);la case à cocher «Utiliser par défaut pour cette action» apparaîtra dans la boîte de dialogue du sélecteur d'application, ainsi l'utilisateur pourra sélectionner l'application par défaut pour l'envoi des e-mails avec plusieurs pièces jointes.
Idolon
2
Cet exemple me donne une "AndroidRuntimeException: appeler startActivity () depuis l'extérieur d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez?" J'ai essayé de transmettre à la fois le contexte d'application et de base à cette méthode de messagerie électronique, et les deux entraînent la même erreur.
ravemir
Cela a résolu le problème pour moi, mais je ne suis pas sûr si j'échappe à une erreur de manière étrange, alors je vais laisser le commentaire précédent ici à tous ceux qui en ont une idée.
ravemir
29

ACTION_SEND_MULTIPLE devrait être l'action

puis emailIntent.setType("text/plain");

suivi par:

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

Cela fonctionne pour moi.

santhana
la source
19

Bien que ce soit un vieux fil, mais comme il est montré en haut sur les recherches Google, je veux ajouter un petit indice pour le rendre complet, c'est pourquoi je suis tombé dessus.

Il est nécessaire de rendre les fichiers joints lisibles pour l'activité de messagerie, sinon ils ne seront pas joints. Donc tu dois appeler quelque part

fileIn.setReadable(true, false)
Thomas
la source
Merci monsieur, le courrier n'a pas pu envoyer les pièces jointes uniquement le courrier.
Josejulio
Merci mec! Je ne pourrais pas faire les photos à envoyer sans cette ligne
konunger
HOU LA LA! cette réponse a totalement sauvé ma journée. Si quelqu'un obtient l'erreur "un ou plusieurs fichiers non joints. Limite 20 Mo" de l'application Gmail, ce correctif résout tout. Meilleur conseil jamais!
belphegor
2

Pour plusieurs pièces jointes, utilisez PutParcelableArrayListExtra(Intent.ExtraStream, uris)où la variable uris est a List<IParcelable>(). Voici un exemple:

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

J'espère que cela t'aides ;)

Michele Caggiano
la source