Cómo adjuntar archivos múltiples al cliente de correo electrónico en android

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

email.putExtra(android.content.Intent.EXTRA_STREAM,...) adjunta sólo uri pasado agregado a él.

¿Puedo adjuntar archivos múltiples? 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[] {"[email protected]"}); ei.putExtra(Intent.EXTRA_SUBJECT, "That one works"); 

Luego agrega archivos 'uris:

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

Espero que ayude.

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

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

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

 public static void sendEmailMulipleFiles(Context context, String toAddress, String subject, String body, ArrayList<String> 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<ResolveInfo> 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> uri = new ArrayList<Uri>(); 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; } } 

Trabajado para mí

  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<Uri> arrayList=new ArrayList<Uri>(); 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...")); 

Después de 1 día de trabajo finalmente puedo adjuntar múltiples archivos de imagen desde la carpeta \ sdcard \ accident \ al cliente de correo electrónico. Para adjuntar varios archivos tuve que añadir las imágenes a ContentResolver que es responsable de 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[] {"[email protected]"}); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Accident Capture"); sendIntent.putExtra(Intent.EXTRA_TEXT, emailBody); ArrayList<Uri> uriList = getUriListForImages(); sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); Log.d(TAG, "Size of the ArrayList :: " +uriList.size()); FormHolderActivity.this.startActivity(Intent.createChooser(sendIntent, "Email:")); 

Así que no hay cambio en la Primera Sección del Código – Pero el cambio está en el método getUriListForImages () que es el siguiente —

 private ArrayList<Uri> getUriListForImages() throws Exception { ArrayList<Uri> myList = new ArrayList<Uri>(); String imageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/accident/"; File imageDirectory = new File(imageDirectoryPath); String[] fileList = imageDirectory.list(); if(fileList.length != 0) { for(int i=0; i<fileList.length; i++) { try { ContentValues values = new ContentValues(7); values.put(Images.Media.TITLE, fileList[i]); values.put(Images.Media.DISPLAY_NAME, fileList[i]); values.put(Images.Media.DATE_TAKEN, new Date().getTime()); values.put(Images.Media.MIME_TYPE, "image/jpeg"); values.put(Images.ImageColumns.BUCKET_ID, imageDirectoryPath.hashCode()); values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileList[i]); values.put("_data", imageDirectoryPath + fileList[i]); ContentResolver contentResolver = getApplicationContext().getContentResolver(); Uri uri = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values); myList.add(uri); } catch (Exception e) { e.printStackTrace(); } } } return myList; } 

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

  • Temporizador de cuenta atrás de Android hasta la fecha
  • ¿Cómo borrar los datos de intención en Actividad después de abrirlos desde url?
  • Uso de Intent en una aplicación de Android para mostrar otra actividad
  • Intención de recibir notificación sobre el evento de conexión BLE en el periférico Android
  • Pausa de envío al marcador
  • Cómo ejecutar una actividad sólo una vez como la pantalla Splash
  • Uso de Youtube Intentar iniciar un video desde un punto de inicio definido
  • Obtener Broadcast recibir cuando la tarjeta SD está desmontando android
  • ¿Qué hace Intent.putExtra?
  • "Error al entregar el resultado" - onActivityForResult
  • ¿Por qué mi aplicación no está en la lista de aplicaciones para abrir el archivo txt?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.