¿Cómo seleccionar múltiples imágenes de la galería en Android?

Estoy haciendo un proyecto en el que quiero seleccionar varias fotos de la galería y quiero guardar eso en la matriz de vista de imagen. Puedo importar una sola imagen y guardarla en la vista de imagen. ¿Alguien puede decir, por favor, cómo puedo importar varias imágenes y guardar en una matriz o diferentes vistas de imagen?

MainActivity extends Activity implements OnClickListener { Button addphoto, save; ImageView img1[]; Bitmap yourbitmap, resized; int RESULT_LOAD_IMAGE1 =1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addphoto = (Button)findViewById(R.id.add); img1[0] = (ImageView)findViewById(R.id.imageView1); save = (Button)findViewById(R.id.save); addphoto.setOnClickListener(this); save.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch(arg0.getId()){ case R.id.add: Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), RESULT_LOAD_IMAGE1); break; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE1 && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); try { yourbitmap = BitmapFactory.decodeFile(picturePath); resized= Bitmap.createScaledBitmap(yourbitmap, 200,300, true); img1[0].setImageBitmap(resized); } catch (Exception e) { e.printStackTrace(); } } } } 

Implementar selector de galería personalizado con el siguiente código:

activity_main

         

custom_gallery

      

custom_gallery_item

     

Actividad principal

 public class MainActivity extends Activity implements View.OnClickListener{ private LinearLayout lnrImages; private Button btnAddPhots; private Button btnSaveImages; private ArrayList imagesPathList; private Bitmap yourbitmap; private Bitmap resized; private final int PICK_IMAGE_MULTIPLE =1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lnrImages = (LinearLayout)findViewById(R.id.lnrImages); btnAddPhots = (Button)findViewById(R.id.btnAddPhots); btnSaveImages = (Button)findViewById(R.id.btnSaveImages); btnAddPhots.setOnClickListener(this); btnSaveImages.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnAddPhots: Intent intent = new Intent(MainActivity.this,CustomPhotoGalleryActivity.class); startActivityForResult(intent,PICK_IMAGE_MULTIPLE); break; case R.id.btnSaveImages: if(imagesPathList !=null){ if(imagesPathList.size()>1) { Toast.makeText(MainActivity.this, imagesPathList.size() + " no of images are selected", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, imagesPathList.size() + " no of image are selected", Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(MainActivity.this," no images are selected", Toast.LENGTH_SHORT).show(); } break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if(requestCode == PICK_IMAGE_MULTIPLE){ imagesPathList = new ArrayList(); String[] imagesPath = data.getStringExtra("data").split("\\|"); try{ lnrImages.removeAllViews(); }catch (Throwable e){ e.printStackTrace(); } for (int i=0;i 

CustomPhotoGalleryActivity

  public class CustomPhotoGalleryActivity extends Activity { private GridView grdImages; private Button btnSelect; private ImageAdapter imageAdapter; private String[] arrPath; private boolean[] thumbnailsselection; private int ids[]; private int count; /** * Overrides methods */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.custom_gallery); grdImages= (GridView) findViewById(R.id.grdImages); btnSelect= (Button) findViewById(R.id.btnSelect); final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }; final String orderBy = MediaStore.Images.Media._ID; @SuppressWarnings("deprecation") Cursor imagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID); this.count = imagecursor.getCount(); this.arrPath = new String[this.count]; ids = new int[count]; this.thumbnailsselection = new boolean[this.count]; for (int i = 0; i < this.count; i++) { imagecursor.moveToPosition(i); ids[i] = imagecursor.getInt(image_column_index); int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); arrPath[i] = imagecursor.getString(dataColumnIndex); } imageAdapter = new ImageAdapter(); grdImages.setAdapter(imageAdapter); imagecursor.close(); btnSelect.setOnClickListener(new OnClickListener() { public void onClick(View v) { final int len = thumbnailsselection.length; int cnt = 0; String selectImages = ""; for (int i = 0; i < len; i++) { if (thumbnailsselection[i]) { cnt++; selectImages = selectImages + arrPath[i] + "|"; } } if (cnt == 0) { Toast.makeText(getApplicationContext(), "Please select at least one image", Toast.LENGTH_LONG).show(); } else { Log.d("SelectedImages", selectImages); Intent i = new Intent(); i.putExtra("data", selectImages); setResult(Activity.RESULT_OK, i); finish(); } } }); } @Override public void onBackPressed() { setResult(Activity.RESULT_CANCELED); super.onBackPressed(); } /** * Class method */ /** * This method used to set bitmap. * @param iv represented ImageView * @param id represented id */ private void setBitmap(final ImageView iv, final int id) { new AsyncTask() { @Override protected Bitmap doInBackground(Void... params) { return MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null); } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); iv.setImageBitmap(result); } }.execute(); } /** * List adapter * @author tasol */ public class ImageAdapter extends BaseAdapter { private LayoutInflater mInflater; public ImageAdapter() { mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return count; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.custom_gallery_item, null); holder.imgThumb = (ImageView) convertView.findViewById(R.id.imgThumb); holder.chkImage = (CheckBox) convertView.findViewById(R.id.chkImage); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.chkImage.setId(position); holder.imgThumb.setId(position); holder.chkImage.setOnClickListener(new OnClickListener() { public void onClick(View v) { CheckBox cb = (CheckBox) v; int id = cb.getId(); if (thumbnailsselection[id]) { cb.setChecked(false); thumbnailsselection[id] = false; } else { cb.setChecked(true); thumbnailsselection[id] = true; } } }); holder.imgThumb.setOnClickListener(new OnClickListener() { public void onClick(View v) { int id = holder.chkImage.getId(); if (thumbnailsselection[id]) { holder.chkImage.setChecked(false); thumbnailsselection[id] = false; } else { holder.chkImage.setChecked(true); thumbnailsselection[id] = true; } } }); try { setBitmap(holder.imgThumb, ids[position]); } catch (Throwable e) { } holder.chkImage.setChecked(thumbnailsselection[position]); holder.id = position; return convertView; } } /** * Inner class * @author tasol */ class ViewHolder { ImageView imgThumb; CheckBox chkImage; int id; } } 

Hay EXTRA_ALLOW_MULTIPLE opción EXTRA_ALLOW_MULTIPLE establecida en la intención a través del método Intent.putExtra() :

  intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

En su código, escriba lo siguiente:

 Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), RESULT_LOAD_IMAGE1); 

Nota: la opción EXTRA_ALLOW_MULTIPLE solo está disponible en Android API 18 y versiones posteriores .

Si desea desarrollar su propia galería, consulte la sección Seleccionar múltiples imágenes de la Galería

Use la biblioteca a continuación para la selección de imágenes múltiples de gallary. https://github.com/sangcomz/FishBun

Aquí está el código para Seleccionar múltiples imágenes y videos de la galería predeterminada.

 Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture); buttonLoadImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent i = new Intent(); i.setType("image/*"); //i.setType("video/*"); i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); i.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult( Intent.createChooser(i, "android.intent.action.SEND_MULTIPLE"), 1); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); System.out.println("++data" + data.getClipData().getItemCount());// Get count of image here. System.out.println("++count" + data.getClipData().getItemCount()); Uri selectedImage = data.getClipData().getItemAt(0).getUri();//As of now use static position 0 use as per itemcount. Bitmap bitmap = null; // Uri selectedImage1 = data.getData(); try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); } catch (IOException e) { e.printStackTrace(); } System.out.println("+++ clipdate" + selectedImage); ImageView imageView = (ImageView) findViewById(R.id.imgView); imageView.setImageBitmap(bitmap); // } } 

Respuesta completa de trabajo

Intención

  Intent intent = new Intent(); intent.setType("image/*"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); } intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_MULTIPLE); 

Resultado de la actividad

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { try { // When an Image is picked if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK && null != data && null != data.getClipData()) { ClipData mClipData = data.getClipData(); Toast.makeText(getActivity(), "You picked " + (mClipData.getItemCount() > 1 ? mClipData.getItemCount() + "Images" : mClipData.getItemCount() + "Image"), Toast.LENGTH_LONG).show(); pickedImageContainer.removeAllViews(); int pickedImageCount; for (pickedImageCount = 0; pickedImageCount < mClipData.getItemCount(); pickedImageCount++) { ImageView productImageView = new ImageView(getActivity()); productImageView.setAdjustViewBounds(true); productImageView.setScaleType(ImageView.ScaleType.FIT_XY); productImageView.setLayoutParams(new LinearLayout .LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); pickedImageContainer.addView(productImageView); Glide.with(getActivity()) .load(mClipData.getItemAt(pickedImageCount).getUri()) .fitCenter().placeholder(R.drawable.map_default) .error(R.drawable.map_default) .into(productImageView); } } else { Toast.makeText(getActivity(), "You haven't picked any Image", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getActivity(), "Error: Something went wrong " + e.getMessage(), Toast.LENGTH_LONG) .show(); } super.onActivityResult(requestCode, resultCode, data); } 

Creo que Android no admite la selección de múltiples imágenes. Para eso necesitas usar alguna biblioteca. yo también estaba atrapado en el mismo

https://github.com/luminousman/MultipleImagePick

este me ayudó.

 This is manifest file code for app to get consider you are sending images to your app                Program code... public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("MainActivity", "on Create "); if (Intent.ACTION_SEND_MULTIPLE.equals(getIntent().getAction())&& getIntent().hasExtra(Intent.EXTRA_STREAM)) { ArrayList list = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM); for (Parcelable parcel : list) { Uri uri1 = (Uri) parcel; Log.d("MainActivity", "on Create uri1 " + uri1); String sourcepath=getPath(uri1); Log.d("MainActivity", "on Create sourcepath " + sourcepath); /// do things here with each image source path. } //Commented by Aishwary coz I want to open the app after selecting images otherwise uncomment to just select //finish(); }else{ // This part is of single image by Aishwary Uri imageUri =(Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM); Log.d("MainActivity", "on Create ImageUri " + imageUri); } } public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); startManagingCursor(cursor); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } } This will allow you to get source path and images url . Now you can make array for url and use this url as you want... 
 int SELECT_PICTURE=1; Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"),SELECT_PICTURE); public void onActivityResult(int requestCode, int resultCode, Intent data) { try { switch (requestCode) { case SELECT_PICTURE: Uri selectedImageUri = data.getData(); imgPerview.setBackgroundColor(Color.TRANSPARENT); LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); imgPerview.setLayoutParams(vp); imgPerview.setScaleType(ImageView.ScaleType.FIT_XY); imgPerview.setImageURI(selectedImageUri); uri = selectedImageUri; } } catch (Exception ex) {} }