Intent.ACTION_GET_CONTENT 和 Intent.ACTION_PICK 之间的区别

Posted

技术标签:

【中文标题】Intent.ACTION_GET_CONTENT 和 Intent.ACTION_PICK 之间的区别【英文标题】:Difference between Intent.ACTION_GET_CONTENT and Intent.ACTION_PICK 【发布时间】:2013-07-19 20:54:19 【问题描述】:

我试图让用户在我正在构建的这个壁纸应用程序中选择他们希望在他们的设备上用作壁纸的任何图像。出于某种原因,当我写作时:

Intent myIntent = new Intent(Intent.ACTION_PICK);
myIntent.setType("image/*");
startActivityForResult(myIntent, 100);

我直接进入画廊,但是当我写作时:

Intent myIntent = new Intent(Intent.ACTION_GET_CONTENT, null);
myIntent.setType("image/*");
startActivityForResult(myIntent, 100);

我可以从 Gallery 或 Google Drive 中进行选择。让用户选择每次从哪个应用程序中检索图片的最佳方法是什么?或者为什么这两个不同的意图常量会有所不同?

【问题讨论】:

【参考方案1】:

您的第一个Intent 无效。 protocol for ACTION_PICK 要求您提供 Uri 来指示您从中挑选的集合。

让用户选择每次从哪个应用中检索图片的最佳方式是什么?

如果您希望用户根据 MIME 类型选择某些内容,请使用 ACTION_GET_CONTENT

如果您希望用户从中选择某些特定集合(由 Uri 标识),请使用 ACTION_PICK

如果出现平局,请使用ACTION_GET_CONTENT。虽然ACTION_PICK 并未正式弃用,但Dianne Hackborn recommends ACTION_GET_CONTENT

【讨论】:

有趣的是,第一个意图确实有效,尽管它无效。欣赏指针。谢谢 出于好奇,为什么 Dianne 听起来像 ACTION_GET_CONTENT 是后来添加到 API 中的,称其为“现代”。它们都在 API 1 中可用,所以如果他们真的不希望人们使用 ACTION_PICK,这让我觉得 android 工程师们搞砸了。 API 1 删除它是否为时已晚? @Turbo:你得问问她,抱歉。 @CommonsWare 您是如何获得以简单方式回答每一个深层问题的能力的。 ? ;) @petrsyn:我没有说ACTION_PICK 无效。我说Intent 无效,因为它没有指定要从中选择的集合的Uri。这在the documentation for ACTION_PICK 和the documentation for ACTION_GET_CONTENT 中有介绍。第二个文档链接有一个损坏的示例;我已提交an issue 以尝试修复该示例。【参考方案2】:

现代动作ACTION_GET_CONTENT得到更好的支持

ACTION_PICK:

Activity Action:从数据中选择一个项目,返回选择的内容。

输入: getData() 是包含数据目录 (vnd.android.cursor.dir/*) 的 URI,从中选择一个项目。

输出:所选择的项目的 URI。

常量值:“android.intent.action.PICK”


区别:-

活动操作:允许用户选择特定类型的数据并将其返回

这与 ACTION_PICK 不同,这里我们只说需要什么样的数据,不是现有数据的 URI,用户可以从中选择。

A ACTION_GET_CONTENT 可以让用户在运行时创建数据(例如拍照或录音),让他们浏览网络并下载所需的数据等。

参考http://developer.android.com/reference/android/content/Intent.html#ACTION_GET_CONTENT

【讨论】:

“ACTION_PICK 已弃用”——从技术上讲,它不是。 在阅读您的示例之前,我无法分辨 ACTION_PICK 和 ACTION_GET_CONTENT 之间的区别:拍照或录制声音。谢谢。 当我使用 action_get_content 时,当我从外部存储卡中选择图像然后将图像上传到服务器时,它会打开所有文件夹 filenotfound 异常即将到来,并且从图库中选择相同的图像它正在上传到服务器。请给我解决方案..【参考方案3】:
 public static final String ACTION_GET_CONTENT

在 API 级别 1 中添加

活动操作:允许用户选择一个 特定类型的数据并返回。这不同于 ACTION_PICK 在这里我们只是说需要什么样的数据,而不是 用户可以从中选择的现有数据的 URI。一种 ACTION_GET_CONTENT 可以允许用户在运行时创建数据 (例如拍照或录音),让他们浏览 通过网络下载所需的数据等。

通过http://developer.android.com/reference/android/content/Intent.html#ACTION_GET_CONTENT

【讨论】:

以上是关于Intent.ACTION_GET_CONTENT 和 Intent.ACTION_PICK 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

意图:删除始终/仅一次按钮

解决华为手机图片选择无效及产生的open failed: EACCES (Permission denied)错误

使用 Intent 打开下载目录

如何检查可用于 Intent 的 ContentProvider(或阻止特定的)

通过 Android 中的 Intent 选择任何类型的文件

Android如何触发intent打开指定目录