10

I am trying to get image's Uri in the Gallery built-in app from inside my application.

so, I was using the Intent below, but it selected many more image.

i want to set limitation. less than 3

@Override
public void onClick(View v) {
    Intent intent = new Intent( );
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    startActivityForResult(Intent.createChooser(intent, "select images"), PICK_IMAGE_MULTIPLE);
}

how do i fix this.

Do you have any suggestions?

3 Answers 3

14

Unfortunately, as stated by http://developer.android.com/reference/android/content/Intent.html#EXTRA_ALLOW_MULTIPLE, this is not possible.

This is a boolean extra; the default is false. If true, an implementation is allowed to present the user with a UI where they can pick multiple items that are all returned to the caller.

You'll have to manually check the returned data to see if it's more than 3 items, and if so, show a Toast and let them try again.

1
  • 1
    How can an answer with no solution have 9 points?
    – ekashking
    Commented May 7, 2021 at 1:16
1

As Daniel stated, there is no possibility with Intent.EXTRA_ALLOW_MULTIPLE. An alternative though, is using the MultipleImageSelect library. Not only can you select multiple images, but the extra ability to set a limit on images selected by the user.

Check out the repository or a sample.

STEPS:

Step 1: Add MultipleImageSelect library, together with jitpack.io to your build.gradle like this:

repositories {
  maven {
    url "https://jitpack.io"
  }
}

dependencies {
  implementation 'com.github.darsh2:MultipleImageSelect:v0.0.4'
}

Step 2: In project's AndroidManifest.xml, add the following under application node:

<activity
  android:name="com.darsh.multipleimageselect.activities.AlbumSelectActivity"
  android:theme="@style/MultipleImageSelectTheme">
  <intent-filter>
     <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Step 3: In the activity from where you want to call image selector, create Intent as follows:

mSelectImagesBtn.setOnClickListener(view -> {
        Intent intent = new Intent(ListingImages.this, AlbumSelectActivity.class);
        intent.putExtra(Constants.INTENT_EXTRA_LIMIT, 3); //set desired image limit here
        startActivityForResult(intent, Constants.REQUEST_CODE);
    });

Step 4: and override onActivityResult like this:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data !=null) {
        ArrayList<Image> images =data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
        imagePathList.clear();
       StringBuffer stringBuffer = new StringBuffer();
       
       //loop to retrieve the paths of each image and display to TextView
       for (int i = 0; i < images.size(); i++) {
            stringBuffer.append(images.get(i).path + "\n");
       }
        textView.setText(stringBuffer.toString());
    }
}

DONE

Alternatively,

If you're using an Adapter to inflate images to display, you can instead have this:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data != null) {
        ArrayList<Image> images = data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
        imagePathList.clear();
        for (int i = 0; i < images.size(); i++) {
            imagePathList.add(images.get(i).path);
        }
        imageAdapter.notifyDataSetChanged();
    }
}

Within ImageAdapter, display images to populate recyclerView, like follows:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    String path = imagePathList.get(position);
    Picasso.with(mContext)
            .load(new File(path))
            .placeholder(R.drawable.ic_house_placeholder)
            .into(holder.image);
}
1

To have an updated answer for this question, this is an example of how to use Photo Picker which allows you to limit the max selected elements :

declare this launcher as a class field in your activity

    //In this example, the app lets the user select up to 5 media files.
private val galleryLauncher = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(5)) { uris ->
        if (!CollectionUtils.isEmpty(uris)) {
            //Do what you wanna do with your uri list
        }else {
            //nothing selected
        }
    }

Include only one of the following calls to launch(), depending on the types of media that you want to let the user choose from.

// Include only one of the following calls to launch(), depending on the types
// of media that you want to let the user choose from.

// Launch the photo picker and let the user choose images and videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

// Launch the photo picker and let the user choose only images.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))

// Launch the photo picker and let the user choose only videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))

// Launch the photo picker and let the user choose only images/videos of a
// specific MIME type, such as GIFs.
val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))
1
  • Do we have any option to change limit of picking images at runtime ? like initially I want to set limit of 5, later I want that limit to be 3 or 2 depending on my requirement Commented Jan 12 at 10:18

Not the answer you're looking for? Browse other questions tagged or ask your own question.