【问题标题】:What is the real difference between ACTION_GET_CONTENT and ACTION_OPEN_DOCUMENT?ACTION_GET_CONTENT 和 ACTION_OPEN_DOCUMENT 之间的真正区别是什么?
【发布时间】:2016-03-23 15:22:09
【问题描述】:

我很难理解ACTION_OPEN_DOCUMENTACTION_GET_CONTENT 意图用于打开可打开文档时的区别。如果我在 KitKat 之前支持 Andriod,KitKat 不支持ACTION_OPEN_DOCUMENT,我是否应该选择ACTION_GET_CONTENT

documentation 是这样说的:

ACTION_OPEN_DOCUMENT 并非旨在替代 ACTION_GET_CONTENT。您应该使用哪种取决于您的需求 你的应用:

  • 如果您希望应用程序简单地读取/导入,请使用 ACTION_GET_CONTENT 数据。使用这种方法,应用程序会导入数据的副本,例如 图片文件。
  • 如果您希望您的应用拥有 对文档拥有的文档的长期、持久访问 提供者。一个例子是允许用户编辑的照片编辑应用程序 存储在文档提供程序中的图像。

ACTION_GET_CONTENT 不也在 KitKat 中使用文档提供程序吗?什么会阻止我拥有“长期、持久的访问权限”?这究竟意味着什么?

基本上下面这两个sn-ps有什么区别?

ACTION_GET_CONTENT

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");

ACTION_OPEN_DOCUMENT

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");

【问题讨论】:

    标签: android


    【解决方案1】:

    ACTION_GET_CONTENT 不也使用 KitKat 中的文档提供程序吗?

    不一定。这取决于发布内容的应用程序的实现。另请注意,DocumentProviderContentProvider 的特定类型。

    什么会阻止我“长期、持久地访问”

    您从ACTION_GET_CONTENT 返回的Uri 可能会为您的应用授予临时权限,以便能够读取和/或写入内容。该授权最终将失效(例如,当您的流程终止时)。因此,例如,将Uri 保存为数据库中的字符串可能毫无意义。

    存储访问框架的一部分包含以下概念:内容提供者可以提供可以持续较长时间(“长期、持久”)的权限授予。虽然没有什么可以阻止应用在 API 级别 19+ 上使用 ACTION_GET_CONTENT 提供此类持久性权限,但使用 ACTION_OPEN_DOCUMENT 时会更常见。

    基本上下面这两个sn-ps有什么区别?

    用户体验会有所不同,因为ACTION_OPEN_DOCUMENT 提供标准化的文件浏览器风格的界面,而ACTION_GET_CONTENT 是传统的选择器对话框,然后是一些特定于应用程序的 UI。

    从您作为该内容的消费者的角度来看,ACTION_GET_CONTENT 是您现在想使用该内容; ACTION_OPEN_DOCUMENT 是您现在和以后想使用的内容。

    编辑:文档链接:

    ACTION_OPEN_DOCUMENT

    ACTION_GET_CONTENT

    来自Common Intents example for opening a specific type of file

    在 Android 4.4 或更高版本上运行时,您可以请求打开由其他应用管理的文件,而不是检索必须导入应用的文件副本(通过使用 ACTION_GET_CONTENT 操作) ACTION_OPEN_DOCUMENT 操作并指定 MIME 类型。要同时允许用户创建您的应用可以写入的新文档,请改用 ACTION_CREATE_DOCUMENT 操作。例如,ACTION_CREATE_DOCUMENT 意图不是从现有的 PDF 文档中选择,而是允许用户选择他们想要创建新文档的位置(在另一个管理文档存储的应用程序中)——然后您的应用程序接收它可以在哪里创建 URI 位置编写新文档。

    虽然从 ACTION_GET_CONTENT 操作传递到 onActivityResult() 方法的意图可能会返回任何类型的 URI,但来自 ACTION_OPEN_DOCUMENT 和 ACTION_CREATE_DOCUMENT 的结果意图始终将所选文件指定为内容:由 DocumentsProvider 支持的 URI。您可以使用 openFileDescriptor() 打开文件并使用 DocumentsContract.Document 中的列查询其详细信息。

    【讨论】:

    • 根据我的经验,从来没有选择器对话框。这两个操作会产生相同的全屏 UI。它就像一个文件浏览器,但您也可以选择滑出一个装满应用程序图标的左侧抽屉。使用每个操作时的唯一区别是左侧的应用程序列表。当我传递图像 MIME 类型时,GET_CONTENT 不仅允许我浏览我的文件夹(如下载),而且在滑出的左侧抽屉中也有一个条目用于 Google Photos、Dropbox 等。如果我使用 OPEN_DOCUMENT,我会得到完全相同的 UI,左侧抽屉中没有任何应用愿意为我提供除 Google 云端硬盘以外的内容。
    • @Stephen:“从来没有选择器对话框”——ACTION_GET_CONTENT 在 Android 4.3 和更早版本上会有一个。 “使用每个操作时唯一的区别是左侧的应用程序列表”——一些应用程序支持其中一个操作,一些应用程序支持另一个。理想情况下,像 Dropbox 这样的应用程序将在 Android 4.4+ 上支持ACTION_OPEN_DOCUMENT,在 Android 4.3 及更低版本上回退到支持ACTION_GET_CONTENT
    • 我刚刚在 4.3 设备上安装了我的应用程序,你是对的!确实出现了“选择器”而不是“文件资源管理器”类型的界面。谢谢您的帮助!顺便说一句,爱你的书。我已经订阅多年了。
    • @Stephen:谢谢你的好话!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2018-06-12
    • 2012-06-02
    • 2020-10-08
    • 2018-01-21
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多