2010-02-15 26 views
93

He estado trabajando en el programa de Android para enviar correos electrónicos con un archivo adjunto (archivo de imagen, archivo de audio, etc.) con intención de ACTION_SEND. El programa funciona cuando el correo electrónico tiene un solo archivo adjunto. Usé Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) para adjuntar el archivo de imagen designado al correo y está funcionando bien, el correo se puede entregar a través de Gmail. Sin embargo, cuando traté de tener varias imágenes adjuntas al mismo correo llamando al Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) varias veces, no funcionó. Ninguno de los archivos adjuntos aparece en el correo electrónico.Android múltiples archivos adjuntos de correo electrónico con la intención

Busqué en la documentación del SDK y en el grupo de usuarios de la programación de Android sobre el archivo adjunto al correo electrónico pero no puedo encontrar ninguna información relacionada. Sin embargo, he descubierto que hay otra intención constante ACTION_SEND_MULTIPLE (disponible desde el nivel 4 de la API) que podría cumplir con mis requisitos. Según la documentación de SDK, simplemente establece que entrega múltiples datos a otra persona, funciona como ACTION_SEND, excepto que los datos son múltiples. Pero todavía no pude entender el uso correcto de este comando. Traté de declarar la intención con ACTION_SEND_MULTIPLE, luego llamé al putExtra(EXTRA_STREAM, uri) varias veces para adjuntar varias imágenes, pero obtuve el mismo resultado erróneo al igual que antes, ninguno de los datos adjuntos aparece en el correo electrónico.

¿Alguien ha intentado con ACTION_SEND_MULTIPLE y lo consiguió trabajando con varios archivos adjuntos de correo electrónico?

+0

tengo el mismo problema. No está funcionando el código. El mismo problema existe durante el envío de MMS, existe la posibilidad de agregar solo un archivo. ¿Tienes algunas ideas sobre esto de otra manera? –

Respuesta

176

Aquí está el código que necesita para crear un emailIntent que contiene varios archivos adjuntos.

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

se olvidó de poner el asunto y emailText con la intención. de lo contrario, gracias por el código. –

+5

El tipo de datos MIME correcto debe ser "text/plain" y no "plain/text": 'emailIntent.setType (" text/plain ");'.Si usa "plain/text" Android forzará el uso de GMail como remitente, pero si usa "text/plain" proporcionará el cuadro de diálogo del selector de aplicaciones con Gmail, Facebook, Bluetooth, etc. Si desea proponer solo programas de correo use "text/xml" en su lugar. – Idolon

+4

Y si cambia la última línea a 'context.startActivity (emailIntent);' la casilla de verificación 'Usar de forma predeterminada para esta acción' aparecerá en el cuadro de diálogo del selector de aplicaciones, por lo que el usuario podrá seleccionar la aplicación predeterminada para enviar los correos electrónicos con múltiples archivos adjuntos – Idolon

24

ACTION_SEND_MULTIPLE debería ser la acción

y luego emailIntent.setType("text/plain");

seguido de:

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

Esto funciona para mí.

17

Aunque este es un tema antiguo, pero como se muestra en la parte superior de las búsquedas de Google, quiero agregar una pequeña sugerencia para completarlo, por lo tanto, me he detenido.

Es necesario hacer que los archivos adjuntos sean legibles para la actividad del correo, de lo contrario no se adjuntarán. Así que hay que llamar a algún lugar

fileIn.setReadable(true, false) 
+0

Gracias señor, el correo no pudo enviar los archivos adjuntos solo el correo. – Josejulio

+0

¡Gracias, amigo! No pude hacer que las imágenes se envíen sin esta línea – konunger

+0

¡GUAU! esta respuesta salvó totalmente mi día. Si alguien obtiene el error "uno o más archivos no conectados. Límite de 20mb" desde la aplicación de Gmail, este arreglo resuelve todo. ¡El mejor consejo! – belphegor

1

Para varios archivos adjuntos utilizar PutParcelableArrayListExtra(Intent.ExtraStream, uris) donde la variable URI es un List<IParcelable>(). He aquí un ejemplo:

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

Esperanza esto ayuda;)

+0

¡Muchas gracias por este código! :) – sha

Cuestiones relacionadas