Intent.ACTION_PICK behaves differently

2020-05-06 08:00发布

问题:

I am using following code to pick an image from the gallery. When I test it with Samsung Galaxy S4, it directly goes to Gallery that is what I want actually.

BUT, when I test my code on LG Optimus II device, it shows a dialog gives an option to choose either Gallery or Picture. In other words, it adds one more layer which I do not want.

Both devices have KitKat 4.4.2 operating system.

public static void showFileChooser(Activity activity) {
  Intent intent = new Intent();
  intent.setType("image/*");
  intent.setAction(Intent.ACTION_PICK);
  activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1);
}

回答1:

when I test my code on LG Optimus II device, it shows a dialog gives an option to choose either Gallery or Picture

That is because there are two activities on that device that support ACTION_PICK of image/* files. There can be zero to N such activities, depending on what apps are on the device. This will include both pre-installed apps and apps that the user installed themselves. These will range from local file managers to general cloud providers (e.g., Dropbox) to image-specific apps (e.g., Instagram).

In other words, it adds one more layer which I do not want.

Then do not use ACTION_PICK. You are delegating to a third-party app; it is up to the user, not you, what third-party app the user wishes to use.



回答2:

if you want Gallery then

    Intent pickImageIntent = new Intent(Intent.ACTION_PICK, 
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

please use for api 19 or above

if (Build.VERSION.SDK_INT < 19) {
                        Intent intent = new Intent();
                        intent.setType("image/jpeg");
                        intent.setAction(Intent.ACTION_GET_CONTENT);

                        startActivityForResult(Intent.createChooser(intent,
                                "Select image to promote"),
                                GALLERY_INTENT_CALLED);

                    } else {
                        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                        intent.addCategory(Intent.CATEGORY_OPENABLE);
                        intent.setType("image/jpeg");
                        startActivityForResult(intent,
                                GALLERY_KITKAT_INTENT_CALLED);
                    }