cómo adjuntar múltiples archivos al cliente de correo electrónico en Android

Estoy usando Intent .ACTION_SEND para obtener un cliente de correo electrónico predeterminado. Funciona bien, pero ahora necesito adjuntar más de un archivo al correo electrónico.

email.putExtra(android.content.Intent.EXTRA_STREAM,...) adjunta solo la última uri añadida.

Entonces, ¿puedo adjuntar varios archivos? Creo que esto se puede hacer usando Intent.ACTION_SEND_MULTIPLE . Aquí está el código que estoy intentando:

 String uri=getScreenShot(); Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("application/octet-stream"); email.putExtra(Intent.EXTRA_STREAM, Uri.parse(uri)); email.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file:"+csvpath)); alert.dismiss(); ctx.startActivity(Intent.createChooser(email, "Send mail...")); 

Gracias por adelantado.

Eso funciona:

 final Intent ei = new Intent(Intent.ACTION_SEND_MULTIPLE); ei.setType("plain/text"); ei.putExtra(Intent.EXTRA_EMAIL, new String[] {"me@somewhere.nodomain"}); ei.putExtra(Intent.EXTRA_SUBJECT, "That one works"); 

luego agrega uris de archivos:

 ArrayList uris = new ArrayList(); ei.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); startActivityForResult(Intent.createChooser(ei, "Sending multiple attachment"), 12345); 

Espero que ayude.

Puede usar el método de intención putParcelableArrayListExtra como se muestra a continuación. En lugar de utilizar de esta manera: email.putExtra(Intent.EXTRA_STREAM, Uri.parse(uri)); , puede usar una ArrayList como se muestra a continuación:

 ArrayList uris = new ArrayList(); //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); } email.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 

Trabajó para mi

  Intent emailIntent=new Intent(Intent.ACTION_SEND_MULTIPLE, Uri.parse("mailto:"+ clientEmail)); emailIntent.putExtra(Intent.EXTRA_SUBJECT,"working-tutor-form From App"); emailIntent.setType("text/plain"); Uri uri1 = Uri.parse("file://" + URI1); Uri uri2 = Uri.parse("file://" + URI2); Uri uri3 = Uri.parse("file://" + URI3); ArrayList arrayList=new ArrayList(); arrayList.add(uri1); arrayList.add(uri2); arrayList.add(uri3); emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,arrayList); emailIntent.putExtra(Intent.EXTRA_TEXT,body); startActivity(Intent.createChooser(emailIntent,"Send Via...")); 

Aquí está la función que hará el trabajo 🙂

 public static void sendEmailMulipleFiles(Context context, String toAddress, String subject, String body, ArrayList attachmentPath) throws Exception { try { Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_EMAIL, new String[] { toAddress }); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_TEXT, body); intent.setType("message/rfc822"); PackageManager pm = context.getPackageManager(); List matches = pm.queryIntentActivities(intent, 0); ResolveInfo best = null; for (final ResolveInfo info : matches) { if (info.activityInfo.packageName.contains(".gm.") || info.activityInfo.name.toLowerCase().contains("gmail")) best = info; } ArrayList uri = new ArrayList(); for (int i = 0; i < attachmentPath.size(); i++) { File file = new File(attachmentPath.get(i)); uri.add(Uri.fromFile(file)); } intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uri); if (best != null) intent.setClassName(best.activityInfo.packageName, best.activityInfo.name); context.startActivity(Intent.createChooser(intent, "Choose an email application...")); } catch (Exception ex) { ex.printStackTrace(); throw ex; } } 

Después de 1 día de trabajo, finalmente puedo adjuntar múltiples archivos de imagen de la carpeta \ sdcard \ accident \ al cliente de correo electrónico. Para adjuntar múltiples archivos, tuve que agregar las imágenes a ContentResolver, que es responsable del proveedor de imágenes de la galería. Aquí está el código completo —

 Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); sendIntent.setType("plain/text"); sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"soubhabpathak2010@gmail.com"}); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Accident Capture"); sendIntent.putExtra(Intent.EXTRA_TEXT, emailBody); ArrayList uriList = getUriListForImages(); sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); Log.d(TAG, "Size of the ArrayList :: " +uriList.size()); FormHolderActivity.this.startActivity(Intent.createChooser(sendIntent, "Email:")); 

Entonces, no hay cambios en la Primera Sección de Código, pero el cambio está en el método getUriListForImages () que es el siguiente —

 private ArrayList getUriListForImages() throws Exception { ArrayList myList = new ArrayList(); String imageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/accident/"; File imageDirectory = new File(imageDirectoryPath); String[] fileList = imageDirectory.list(); if(fileList.length != 0) { for(int i=0; i 

Esto funciona bien y puedo adjuntar múltiples archivos de imagen al cliente de correo electrónico predeterminado del emulador y luego enviarlos con éxito.