Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I share multiple files via an Intent?

Here is my code, but this is for a single file solution.

Can I share multiple files & uploads like I do for single files below?

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);             }         });  
like image 366
osmund sadler Avatar asked Mar 22 '13 18:03

osmund sadler


2 Answers

Yes but you'll need to use Intent.ACTION_SEND_MULTIPLE instead of 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<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); 

This could definitely be simplified but I left some lines in so you can break down each step that is needed.

UPDATE: Starting in API 24, sharing file URIs will cause a FileUriExposedException. To remedy this, you can either switch your compileSdkVersion to 23 or lower or you can use content URIs with a FileProvider.

UPDATE (to the update): Google recently announced that new apps and app updates would be required to target one of the latest versions of Android for release to the Play Store. That said, targeting API 23 or lower is no longer a valid option if you plan to release the app to the store. You must go the FileProvider route.

like image 181
Michael Celey Avatar answered Sep 20 '22 17:09

Michael Celey


Here is little improved version improvised by MCeley's solution. This could be used to send the heterogeneous file list (like image, document and video at same time), for instance uploading downloaded documents, images at same time.

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))); } 
like image 41
A.B. Avatar answered Sep 21 '22 17:09

A.B.