【问题标题】:android open gallery via intent ACTION_PICK vs ACTION_GET_CONTENTandroid 通过意图 ACTION_PICK 与 ACTION_GET_CONTENT 打开图库
【发布时间】:2017-10-10 09:00:22
【问题描述】:

在我的应用程序中,我想让用户从图库中选择一张图片并检索结果(缩略图 + 完整图片 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,但问题是它没有打开选择器供用户选择要使用的画廊应用程序,而是打开了这个东西(见下图) ,我认为这是一个默认的“图像选择器”,您可以通过菜单选择另一个应用程序。

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

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

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");

但“附加”为空。

是否有可能有一个适当的“应用程序选择器”并取回缩略图?

【问题讨论】:

标签: android android-intent android-gallery


【解决方案1】:

但是现在我有一个新问题:在 onActivityResult(...) 行 data.getParcelable("data");返回空值。换句话说,我没有取回缩略图。

您也无法从ACTION_GET_CONTENT 那里得到。您可以通过阅读the documentation for ACTION_GET_CONTENT 来了解这一点。当然有可能有一些错误的ACTION_GET_CONTENT 活动碰巧在"data" 额外返回一个缩略图Bitmap,但你不应该假设任何用户都会有这样一个错误的ACTION_GET_CONTENT 活动,更不用说选择它。此外,ACTION_GET_CONTENT 不限于图片; application/json 或 text/csv 的“缩略图”是什么?

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

是否有可能有一个适当的“应用程序选择器”并取回缩略图?

不,只要您没有从除ACTION_IMAGE_CAPTURE 之外的任何地方获得缩略图,那是为了拍照。

【讨论】:

  • 好吧,根据我在问题中提供的链接,谷歌确实说这是检索缩略图的方式(在“文件存储”-“检索特定类型的文件”下),我确实得到了一个缩略图(不知道它是否应该发生或者它只是一个“错误的活动”,就像你说的那样)。我同意你所说的 GET_CONTENT 不限于图片,但我可以使用“CATEGORY_OPENABLE”来缩小范围
  • @or_dvir:“谷歌确实说这是检索缩略图的方法”——这很可能是该培训指南中的复制/粘贴错误。 “我同意你所说的 GET_CONTENT 不限于图像,但我可以使用“CATEGORY_OPENABLE”来缩小范围”——CATEGORY_OPENABLE 与内容的 MIME 类型无关,CATEGORY_OPENABLE 不会强迫开发人员从ACTION_GET_CONTENT 活动返回缩略图。
  • 指南中的复制粘贴错误绝对有可能......请其他人确认一下吗?
  • @or_dvir:你可以自己确认。使用存储访问框架 UI 选择图像(您将其描述为“默认的“图像选择器”事物”)。在 Android 7.1 上,Intent 为 ACTION_GET_CONTENT 返回到 onActivityResult() 没有额外功能(在 Nexus 5X 上测试,使用稍微修改过的 this sample app 版本强制它使用 ACTION_GET_CONTENT 并检查额外功能)。
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 2014-06-08
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
相关资源
最近更新 更多