android打开图库通过意图ACTION_PICK vs ACTION_GET_CONTENT

时间:2017-05-11 11:24:54

标签: android android-intent android-gallery

在我的应用程序中,我希望用户从库中选择一个图像并检索结果(缩略图+完整图像uri)。我还希望用户能够选择要打开的图库应用(即默认图库应用或其他图库应用)。

最初,根据谷歌的guide我复制并粘贴了这段代码:

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        Uri fullPhotoUri = data.getData();
        // Do work with photo saved at fullPhotoUri
        ...
    }
}

虽然它确实让我获得了onActivityResult(...)中的缩略图和完整的Uri,但问题是它没有为用户打开选择器来选择要使用的图库应用程序,而是打开这个东西(参见图像)下面),我假设是一个默认的“图像选择器”的东西,你可以通过菜单选择另一个应用程序。

enter image description here enter image description here

我觉得用户必须首先打开这个默认的“图像选择器”并且一旦他们已经处于“图像选择器”中,这是愚蠢的,选择他们实际想要使用的图库应用程序(当然,用户可能只是选择这个东西的图像,但我想给他们一个方便的选择)。

所以我把我的代码更改为了这个,它确实为用户显示了一个合适的选择器,他可以直接找到他最喜欢的画廊应用程序:

Intent intent = new Intent(Intent.ACTION_PICK,
                                   MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");

        if (intent.resolveActivity(getActivity().getPackageManager()) != null)
        {
            startActivityForResult(intent, Utils.REQUEST_CODE_OPEN_GALLERY);
        }

但是现在我遇到了一个新问题:在onActivityResult(...)中,行data.getParcelable("data");返回null。换句话说,我没有拿回缩略图。

我也试过

Bundle extras = data.getExtras();
                Bitmap thumbnail = (Bitmap) extras.get("data");

但“extras”为空。

是否有可能拥有一个合适的“app chooser” AND 取回缩略图?

1 个答案:

答案 0 :(得分:0)

  

然而现在我遇到了一个新问题:在onActivityResult(...)中行data.getParcelable(" data");返回null。换句话说,我没有拿回缩略图。

你也没有从ACTION_GET_CONTENT得到这个。你可以通过阅读the documentation for ACTION_GET_CONTENT来说明这一点。当然可能会发生一些错误的ACTION_GET_CONTENT活动,这些活动恰好会在Bitmap额外的内容中返回缩略图"data",但您不应该假设任何用户都会遇到这样的错误ACTION_GET_CONTENT 1}}活动,更不用说选择它了。此外,ACTION_GET_CONTENT不仅限于图像;什么是"缩略图"是application/json还是text/csv

同样,如果您阅读the documentation for ACTION_PICK,您会发现没有关于缩略图的讨论。

  

是否可以拥有一个合适的应用选择器"并取回缩略图?

不,只要您没有从ACTION_IMAGE_CAPTURE以外的任何内容获取缩略图,那就是拍照。