提问者:小点点

ACTION_GET_CONTENT和ACTION_OPEN_DOCUMENT的真正区别是什么?


我很难理解ACTION_OPEN_DOCUMENTACTION_GET_CONTENTACTION_OPEN_DOCUMENT,我应该只接受ACTION_GET_CONTENT

文档是这样说的:

ACTION_OPEN_DOCUMENT并不打算替代ACTION_GET_CONTENT。您应该使用的那个取决于您的应用程序的需求:

    < li >如果您希望您的应用程序只读取/导入数据,请使用< code>ACTION_GET_CONTENT。通过这种方法,应用程序导入数据的副本,如图像文件。 < li >如果您希望您的应用程序能够长期、持久地访问文档提供商拥有的文档,请使用< code > ACTION _ OPEN _ DOCUMENT 。一个例子是照片编辑应用程序,它允许用户编辑存储在文档提供商中的图像。

ACTION_GET_CONTENT是否也使用KitKat中的文档提供程序?什么会阻止我“长期、持久地访问”?这到底意味着什么?

基本上,以下两个片段有什么区别?

ACTION_GET_CONTENT

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

动作_打开_文档

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

共1个答案

匿名用户

在KitKat中ACTION_GET_CONTENT不也使用文档提供者吗?

不一定。这取决于发布内容的应用程序的实现。另请注意,< code>DocumentProvider是< code>ContentProvider的特定类型。

什么会阻止我拥有“长期、持久的访问权限”

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

存储访问框架的一部分包括这样的概念,即内容的提供者可以提供许可授权,该许可授权可以持续很长一段时间(“长期的、持久的”)。虽然没有什么可以阻止应用程序通过API Level 19上的< code>ACTION_GET_CONTENT提供这种持久权限,但它们在< code > ACTION _ OPEN _ DOCUMENT 中会更常见。

基本上,以下两个片段有什么区别?

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

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

编辑:文档链接:

动作_打开_文档

ACTION_GET_CONTENT

来自用于打开特定类型文件的Common Intents示例:

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

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