it-swarm.com.de

Wie kann ich mehrere Dateien über einen Intent freigeben?

Hier ist mein Code, aber dies ist für eine einzelne Dateilösung.

Kann ich mehrere Dateien und Uploads wie für einzelne Dateien weitergeben?

Button btn = (Button)findViewById(R.id.hello);

    btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_SEND);

                String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pic.png";
                File file = new File(path);

                MimeTypeMap type = MimeTypeMap.getSingleton();
                intent.setType(type.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(path)));

                intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                intent.putExtra(Intent.EXTRA_TEXT, "1111"); 
                startActivity(intent);
            }
        }); 
26
osmund sadler

Ja, aber Sie müssen Intent.ACTION_SEND_MULTIPLE anstelle von Intent.ACTION_SEND verwenden.

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<Uri> files = new ArrayList<Uri>();

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);

Dies könnte auf jeden Fall vereinfacht werden, aber ich habe einige Zeilen hinterlassen, so dass Sie jeden erforderlichen Schritt aufschlüsseln können.

UPDATE: Ab API 24 wird beim Freigeben von Datei-URIs eine FileUriExposedException ausgelöst. Um dies zu beheben, können Sie entweder Ihre compileSdkVersion auf 23 oder eine niedrigere Version setzen oder content-URIs mit einem FileProvider verwenden.

UPDATE (zum Update): Google hat kürzlich angekündigt dass neue Apps und App-Updates erforderlich sind, um eine der neuesten Versionen von Android für die Veröffentlichung im Play Store bereitzustellen. Das Targeting-API 23 oder eine niedrigere Version ist jedoch keine gültige Option mehr, wenn Sie die App für den Store freigeben möchten. Sie müssen die FileProvider-Route aufrufen.

75
Michael Celey

Hier ist eine wenig verbesserte Version, die von MCeleys Lösung improvisiert wurde. Dies kann zum Senden der heterogenen Dateiliste (wie Bild, Dokument und Video gleichzeitig) verwendet werden, z. B. zum Hochladen heruntergeladener Dokumente oder Bilder.

public static void shareMultiple(List<File> files, Context context){

    ArrayList<Uri> 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)));
}
4
A.B.
/* 
 manifest file outside the applicationTag write these permissions
     <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" /> */

    File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                            //Get a top-level public external storage directory for placing files of a particular type. 
                            // This is where the user will typically place and manage their own files, 
                            // so you should be careful about what you put here to ensure you don't 
                            // erase their files or get in the way of their own organization...
                            // pulled from Standard directory in which to place pictures that are available to the user to the File object

                            String[] listOfPictures = pictures.list();
                            //Returns an array of strings with the file names in the directory represented by this file. The result is null if this file is not a directory.

                            Uri uri=null; 
                            ArrayList<Uri> arrayList = new ArrayList<>();
                            if (listOfPictures!=null) {
                                for (String name : listOfPictures) {
                                    uri = Uri.parse("file://" + pictures.toString() + "/" + name );
                                    arrayList.add(uri);
                                }
                                Intent intent = new Intent();
                                intent.setAction(Intent.ACTION_SEND_MULTIPLE);
                                intent.putExtra(Intent.EXTRA_STREAM, arrayList);
                                //A content: URI holding a stream of data associated with the Intent, used with ACTION_SEND to supply the data being sent.
                                intent.setType("image/*"); //any kind of images can support.
                                chooser = Intent.createChooser(intent, "Send Multiple Images");//choosers title
                                 startActivity(chooser);
                            }
1

Wenn Sie Freigabe einer Datei für andere Anwendungen auf Geräten, auf denen KitKat und höher ausgeführt wird, müssen Sie Uri-Berechtigungen bereitstellen.


So gehe ich mit mehreren Dateifreigaben vor und nach KitKat um:

//All my paths will temporarily be retrieve into this ArrayList
ArrayList<PathModel> pathList;
//All Uri's are stored in this ArrayList
ArrayList<Uri> 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 store in SQLite, I retrieve them first
    SQLiteHelper helper = new SQLiteHelper(this);
    //Temporarily store file paths
    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 ArrayList
    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 store in SQLite, I retrieve them first
    SQLiteHelper helper = new SQLiteHelper(this);
    //Temporarily store file paths
    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 PathModer ArrayList
    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 the files that will be sent will 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"));

In meinem Fall wurden die Pfade in SQLite gespeichert, aber die Pfade können von überall herkommen.

0
HB.