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.
- Detectar cuándo un dispositivo USB está separado en Android
- Java.lang.SecurityException: Permiso Negación: no se permite enviar broadcast android.intent.action.MEDIA_MOUNTED en KitKat solamente
- Comparación del uso del reconocimiento de voz en Android: por Intent o on-thread?
- Envío de datos a la actividad principal de android
- Intención de filtro basada en datos personalizados
¿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.
- Pasar un LinkedHashMap <Objeto, Cadena> de una actividad a otra
- Cómo obtener la ruta de la imagen en onActivityresult (Intent data is null)
- Detectar si un auricular está conectado a un dispositivo Android o no.
- Se pierden datos extra de la intención de Android
- Cómo transferir datos extra de un fragmento a otro a través de la actividad
- Iniciar aplicación desde el navegador url esquema
- ¿Alguien por favor explique RESULT_FIRST_USER
- Más información sobre IntentService
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.
- ¿Cómo puedo iniciar una aplicación específica de forma programática en Android?
- MediaPlayer.setDataSource provoca IOException para archivo válido