web-dev-qa-db-fra.com

Android Plusieurs pièces jointes utilisant Intent

J'ai travaillé sur le programme Android) pour envoyer un courrier électronique avec une pièce jointe (fichier image, fichier audio, etc.) en utilisant Intent avec ACTION_SEND. Le programme fonctionne lorsque la pièce jointe unique. J'ai utilisé Intent.putExtra(Android.content.Intent.EXTRA_STREAM, uri) pour joindre le fichier image désigné au courrier électronique et tout fonctionne normalement, le courrier peut être remis via Gmail. Toutefois, lorsque j'ai essayé de joindre plusieurs images au même courrier en appelant Intent.putExtra(Android.content.Intent.EXTRA_STREAM, uri) à plusieurs reprises, cela n'a pas fonctionné. Aucune pièce jointe n'apparaît dans le courrier électronique.

J'ai cherché dans la documentation du SDK et Android le groupe d'utilisateurs de programmation sur la pièce jointe d'un courrier électronique, 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 l'API Selon la documentation du SDK, il indique simplement qu'il fournit plusieurs données à quelqu'un d'autre, il fonctionne comme ACTION_SEND, sauf que les données sont multiples. Mais je ne pouvais toujours pas comprendre le utilisation correcte de cette commande. J'ai essayé de déclarer l'intention avec ACTION_SEND_MULTIPLE, puis j'ai appelé putExtra(EXTRA_STREAM, uri) plusieurs fois pour joindre plusieurs images, mais j'ai obtenu le même résultat erroné qu'avant, aucune pièce jointe montrer dans l'email.

Est-ce que quelqu'un a essayé avec ACTION_SEND_MULTIPLE Et l'a fait fonctionner avec plusieurs pièces jointes?

97
yyyy1234

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

ACTION_SEND_MULTIPLE Devrait être l'action

et 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.

28
santhana

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, donc je suis tombé dessus.

Il est nécessaire de rendre les fichiers joints lisibles pour l’activité courrier, sinon ils ne seront pas joints. Donc, vous devez appeler quelque part

fileIn.setReadable(true, false)
19
thomas

Ici, j'ai trouvé un bon exemple http://www.blackmoonit.com/2010/02/filebrowser-send-receive-intents/

tu dois utiliser

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

Pour plusieurs pièces jointes, utilisez PutParcelableArrayListExtra(Intent.ExtraStream, uris) où la variable uris est un 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 ;)

2
Michele Caggiano