问题标签 [storage-access-framework]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
31069 浏览

android - 使用 KitKat 存储访问框架后打开 Google Drive File Content URI

我正在使用适用于 android 4.4 的存储访问框架并打开文件选择器。

一切正常,除了从 Google Drive 中选择文件时,我只能弄清楚如何将其作为输入流打开,但我想获得一个 java File 对象。

返回的内容 uri 如下所示: content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279

其他类似但没有有效解决方案的问题允许我获取文件名、文件大小和内容:

我还研究了 Paul Burke 的 FileChooser ( https://github.com/iPaulPro/aFileChooser ),这是问题列表中最常见的问题。

如何从该内容 uri 中获取文件?

我目前的解决方法是从输入流中写出一个临时文件。

谢谢!

0 投票
2 回答
16558 浏览

java - 如何在 android API 19 (KitKat) 中保持权限?

在我的应用程序中,我将图像路径存储在我的 SQlite 数据库中以供进一步使用。我得到的路径是

当我从数据库中检索此路径并尝试从 android 抛出的该路径中检索图像时

根据https://developer.android.com/guide/topics/providers/document-provider.html#permissions我需要通过添加以下代码来保持权限

当我将此代码添加到扩展 BaseAdapter android 的 ImageAdapter 类中时

这是我的 ImageAdapter 代码的相关部分

我究竟做错了什么?谢谢

0 投票
1 回答
117 浏览

java - 使用存储访问框架

如果你写一些数据,它工作得很好。但是如果你写了很多数据(会运行很长时间),它会失败:java.io.IOException: write failed: EBADF (Bad file number)

这是代码:

0 投票
2 回答
1922 浏览

android - 如何处理 SD 卡的 Kitkat 规则和限制?

背景

自 Kitkat (API 19) 以来,谷歌添加了一些限制和 API 来访问 SD 卡(或更准确地说,是第二个外部存储)。

第三方应用程序不能再写入除他们自己以外的任何文件夹上的 SD 卡,除非它们具有 root 权限或者它们是系统应用程序。

谷歌添加了一个内置的系统应用程序,可以管理 SD 卡上的文件,称为“文件选择器”,它有一些用户可以完成的操作。

新的 API 称为“存储访问框架”。关于它的更多信息可以在这里找到。

问题

没有太多关于如何处理以前总是可能的特定操作的信息。诚然,它们被用于所有外部存储操作,但谷歌最近才处理这种类型的存储。

我也没有找到关于可以在新的“文件选择器”上完成的可用事情的足够信息,以及不能用它完成的事情。

该框架似乎支持对属于其他应用程序的文件的操作,但有些文件是由用户复制的(例如从 PC 复制),所以我不确定如何处理这些文件。

问题

  1. 如何处理新 API 的下一个操作:在 SD 卡上的任何位置创建、删除和修改任何文件?

  2. 是否有打开新工具的意图,向用户显示特定路径,他可以在哪里手动对文件进行操作?

  3. 我可以假设从 Kitkat 开始,该工具将永远存在吗?如果没有,我该怎么办?有没有其他选择?

  4. 对于已“修复”此限制写入 sd 卡的用户(例如使用此工具),是否有任何官方方法来确定是否授予完全访问权限?当然,除了尝试在某处创建一个随机文件并将其删除之外......

  5. 新 API 的可用意图是什么?我发现的所有意图都与处理其他应用程序的文件有关,以防它们支持它,但我找不到任何处理任何文件路径的意图。

0 投票
1 回答
760 浏览

java - 从 SAF 内容 URI 中提取文件名

你好,我的 stackoverflow 伙伴,

我正在编写一个应用程序,在其中实现了一个处理共享意图的活动。到目前为止它工作正常,但在测试期间我遇到了 Quickoffice(Android 4.4,KitKat)的问题,因为它返回一个我无法从中获取文件名的 URI。我还尝试与 Dropbox 等其他应用程序共享,它在那里工作。

我从 Qickoffice 应用程序获得的确切 URI:

这是我首先使用的代码:

我收到以下错误的地方:

经过一番研究,我发现 Android 4.4 Kitkat 引入了不同的管理数据的 SAF(存储访问框架),所以我尝试了https://developer.android.com/guide/topics/providers/document-provider.html中的以下代码获取名称:

但我也收到一个错误代码:

如果有人知道如何从我从 Quickoffice 获得的 URI 中获取名称,我将非常感激。

0 投票
1 回答
346 浏览

android - 如何在一个简单的文件上传代码按钮中使用存储访问框架?

我是 android 新手,我想使用存储访问框架上传文件以使用户能够从中选择文件,最好的简单方法是什么以及如何做到这一点?谢谢你的回答。

0 投票
1 回答
665 浏览

android - Android 存储访问框架 - 自定义文件类型的启动选择器

我正在尝试在我的应用程序中使用 SAF 选择器来查找我的自定义文件类型。当文件具有 mime 类型时,通过调用 setType("text/plain") 或类似方法,这样做很容易。

如果我想查找所有带有“.blah”扩展名的文件,调用会是什么样子?

编辑:更多信息:文件类型实际上是扩展名已更改的纯文本文件。在文件中,存在一些文本,我对其进行解析以从中创建一些数据结构。但是,当用户查找特定扩展名的文件时,我希望他们只看到我的自定义文件,而不是所有文本文件。

0 投票
0 回答
885 浏览

android - 可以使用带有 Google Drive 的存储访问框架覆盖现有文件吗?

我正在使用带有 ACTION_CREATE_DOCUMENT 意图的 Android 中的存储访问框架在 Google Drive 上创建一个文本文件。工作正常。

但是,如果我存储一个名为“new.txt”的文件,然后 5 分钟后另一个文件也称为“new.txt”(内容不同),那么现在有两个同名文件(在同一个驱动器目录中) .

是否有可能检测是否存在具有该名称(和相同的 mimetype)的现有文件,然后使用具有 ACTION_CREATE_DOCUMENT 意图的新内容覆盖它?

我不希望用户选择带有 ACTION_OPEN_DOCUMENT 意图的文件,因为如果实际上没有以前的文件(即第一次上传),那么用户无法选择要修改的文件。

我只需要存储在 Google Drive 中,而不是本地存储在 SD 卡上。我知道我可以使用 Google Drive API,但如果有存储访问框架的简单解决方案,我更愿意?

0 投票
4 回答
4908 浏览

android-intent - Android OPEN_DOCUMENT_TREE Intent 根位置

我正在使用 Android 5.0(API 级别 21)中引入的Directory Selection API,让用户选择一个目录来保存文件。

要选择一个目录,我构建并发送一个 ACTION_OPEN_DOCUMENT_TREE 意图,如下面的代码所示:

我得到以下弹出窗口:

在此处输入图像描述

但是,如果我让用户使用 ACTION_OPEN_DOCUMENT 意图选择文件:

然后,我得到以下弹出窗口:

在此处输入图像描述

我正在我的 Android 5.0.1 Nexus Tab 10 中对其进行测试。为什么我使用 ACTION_OPEN_DOCUMENT_TREE 和 ACTION_OPEN_DOCUMENT 获得不同的根位置?也许只有 Internal Storage Document Provider 实例支持子树选择?

我还希望允许用户使用 ACTION_OPEN_DOCUMENT_TREE 选择 Google Drive 目录。

ACTION_OPEN_DOCUMENT_TREE 和 ACTION_OPEN_DOCUMENT 参考都说

调用时,系统将显示安装在设备上的各种 DocumentsProvider 实例,让用户浏览它们。

非常感谢您提前

0 投票
1 回答
2014 浏览

android - 从 Lollipop 中的谷歌驱动器获取文件路径(MediaStore.MediaColumns.DATA == null)

当用户点击谷歌驱动器中的“发送文件”按钮并选择我的应用程序时。我想获取该文件的文件路径,然后允许用户将其上传到不同的位置。

我为 kitkat 手机查看了这些类似的 SO 帖子:Get real path from URI, Android KitKat new storage access framework

Android - 将 URI 转换为棒棒糖上的文件路径

然而,解决方案似乎不再适用于 Lollipop 设备。

问题似乎是 MediaStore.MediaColumns.DATA 在 ContentResolver 上运行查询时返回 null。

https://code.google.com/p/android/issues/detail?id=63651

您应该使用 ContentResolver.openFileDescriptor() 而不是尝试获取原始文件系统路径。“_data”列不是 CATEGORY_OPENABLE 合约的一部分,因此 Drive 不需要返回它。

我已阅读CommonsWare 的这篇博客文章,其中建议我“尝试直接将 Uri 与 ContentResolver 一起使用”,但我不明白。如何直接将 URI 与 ContentResolvers 一起使用?

但是,我仍然不清楚如何最好地处理这些类型的 URI。

我能找到的最佳解决方案是调用 openFileDescriptor 然后将文件流复制到一个新文件中,然后将该新文件路径传递给我的上传活动。

这里唯一的问题是我丢失了该文件的文件名。这似乎有点过于复杂,只是为了从驱动器获取文件路径。有一个更好的方法吗?

谢谢。

编辑:所以我可以使用普通查询来获取文件名。然后我可以将它传递给我的 getDriveAbsolutePath() 方法。这将使我非常接近我想要的,现在唯一的问题是我缺少文件扩展名。我所做的所有搜索都建议使用文件路径来获取扩展名,而我无法使用 openFileDescriptor()。有什么帮助吗?

但是,我并不完全相信这是做到这一点的“正确”方式?