Saltar al contenido

¿Cómo puedo compartir varios archivos a través de un Intent?

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 SQLitepero los caminos pueden venir de donde sea.

Acuérdate de que puedes optar por la opción de esclarecer .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *