Tenemos el hallazgo a este enigma, o por lo menos eso creemos. Si continuas con alguna pregunta puedes dejarlo en el apartado de comentarios, que para nosotros será un placer responderte
Solución:
Sí, pero tendrás que usar Intent.ACTION_SEND_MULTIPLE
en lugar de Intent.ACTION_SEND
.
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putExtra(Intent.EXTRA_SUBJECT, "Here are some files.");
intent.setType("image/jpeg"); /* This example is sharing jpeg images. */
ArrayList files = new ArrayList();
for(String path : filesToSend /* List of the files you want to send */)
File file = new File(path);
Uri uri = Uri.fromFile(file);
files.add(uri);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files);
startActivity(intent);
Esto definitivamente podría simplificarse, pero dejé algunas líneas para que pueda desglosar cada paso que se necesita.
ACTUALIZAR: a partir de API 24, compartir URI de archivos generará una excepción FileUriExposedException. Para remediar esto, puede cambiar su compileSdkVersion a 23 o menos o puede usar URI de contenido con un FileProvider.
ACTUALIZAR (a la actualización): Google anunció recientemente que se requerirían nuevas aplicaciones y actualizaciones de aplicaciones para apuntar a una de las últimas versiones de Android para su lanzamiento en Play Store. Dicho esto, apuntar a API 23 o inferior ya no es una opción válida si planea lanzar la aplicación en la tienda. Debe ir a la ruta FileProvider.
Aquí hay una pequeña versión mejorada improvisada por la solución de MCeley. Esto podría usarse para enviar la lista de archivos heterogéneos (como imagen, documento y video al mismo tiempo), por ejemplo, cargar documentos descargados, imágenes al mismo tiempo.
public static void shareMultiple(List files, Context context)
ArrayList uris = new ArrayList<>();
for(File file: files)
uris.add(Uri.fromFile(file));
final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("*/*");
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
context.startActivity(Intent.createChooser(intent, context.getString(R.string.ids_msg_share)));
Si usted es compartir un archivo con otras aplicaciones en dispositivos que ejecutan KitKat y superiordeberá proporcionar permisos Uri.
Así es como manejo el uso compartido de múltiples archivos antes y después de KitKat:
//All my paths will temporarily be retrieve into this ArrayList
//PathModel is a simple getter/setter
ArrayList pathList;
//All Uri's are retrieved into this ArrayList
ArrayList uriArrayList = null;
//This is important since we are sending multiple files
Intent sharingIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
//Used temporarily to get Uri references
Uri shareFileUri;
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
//My paths are stored in SQLite, I retrieve them first
SQLiteHelper helper = new SQLiteHelper(this);
pathList = helper.getAllAttachments(viewholderID);
helper.close();
//Create new instance of the ArrayList where the Uri will be stored
uriArrayList = new ArrayList<>();
//Get all paths from my PathModel
for (PathModel data : pathList)
//Create a new file for each path
File mFile = new File(data.getPath());
//No need to add Uri permissions for pre-KitKat
shareFileUri = Uri.fromFile(mFile);
//Add Uri's to the Array that holds the Uri's
uriArrayList.add(shareFileUri);
else
//My paths are stored in SQLite, I retrieve them first
SQLiteHelper helper = new SQLiteHelper(this);
pathList = helper.getAllAttachments(viewholderID);
helper.close();
//Create new instance of the ArrayList where the Uri will be stored
uriArrayList = new ArrayList<>();
//Get all paths from my PathModel
for (PathModel data : pathList)
//Create a new file for each path
File mFile = new File(data.getPath());
//Now we need to grant Uri permissions (kitKat>)
shareFileUri = FileProvider.getUriForFile(getApplication(), getApplication().getPackageName() + ".provider", mFile);
//Add Uri's to the Array that holds the Uri's
uriArrayList.add(shareFileUri);
//Grant read Uri permissions to the intent
sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//I know that the files which will be sent will be one of the following
sharingIntent.setType("application/pdf/*|image|video/*");
//pass the Array that holds the paths to the files
sharingIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriArrayList);
//Start intent by creating a chooser
startActivity(Intent.createChooser(sharingIntent, "Share using"));
En mi caso, las rutas se almacenaron en SQLite
pero los caminos pueden venir de donde sea.
Acuérdate de que puedes optar por la opción de esclarecer .