问题标签 [documentfile]

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 投票
1 回答
55 浏览

android - 无法再次将 Uri 转换为 String 和 String 到 Uri

我正在开发音乐播放器,并希望使用存储访问框架来访问存储中的文件。为此,我使用了Intent.ACTION_OPEN_DOCUMENT_TREEand contentResolver.takePersistableUriPermission(...)。但是一旦我获得了权限,我就必须存储允许的路径,以便我使用SharedPreferences它。

当我将我从Intent.ACTION_OPEN_DOCUMENT_TREEto 字符串中获得的 URI 转换为重用它时,它给了我一个nullPointerException(它说我从首选项转换字符串获得的 URI 是null)。

虽然如果我使用相同的 URI 而不通过保存到SharedPreferences,它工作得很好。

这是代码:

如果onCreate()我取消注释listFiles(),它给出nullPointerException但使用与您在上面看到的相同的代码块onActivityResult(),一切正常。我正在谈论的块:

我不明白为什么它说rootUri是空的。

我查看了所有类似这样的问题。我正在使用建议的相同功能 (toString()Uri.parse) 进行转换,但它似乎不适用于存储访问框架。

0 投票
2 回答
1329 浏览

android - Android 11:DocumentFile findFile() 太慢

随着谷歌存储策略的更新,我不得不改变我保存文件的方式。

首先,我的应用程序之前将项目文件夹保存到 /sdcard/。但是,由于这个政策,使用 File 访问变得不可能,我尝试了几种方法。

我也想过把它保存在一个特定于应用程序的文件空间中,但是由于删除应用程序时不应删除项目文件夹,因此无法使用。

1.使用媒体存储

起初,我尝试使用 MediaStore。我可以使用RELATIVE_PATH将文件放在一个文件夹中,但是文件的控制非常困难,并且项目文件夹中的文件也是与媒体(照片,视频,音乐)无关的文件。

2.使用文档文件

我找到了另一种方法。使用 Intent 的 ACTION_OPEN_DOCUMENT_TREE,我从用户那里获得了项目文件夹的访问权限和树 uri,并且我能够通过使用它创建 DocumentFile 来访问该文件。

起初我认为这是一个非常好的方法,但很快我发现它很慢。

特别是对于 findFile() 方法,扫描单个文件需要将近一秒钟的时间。我的项目文件夹里有几十个文件,所以这个不能商业化。

有没有更好的办法?有一些帖子要求您试用 DocumentContracts,但似乎没有获取文件列表或检查它们是否存在的功能。

以下是我当前的代码:首先,请求树 uri:

二、获取树uri:

而且,尤其是这样使用 findFile 时,它​​会变得非常慢。

0 投票
1 回答
39 浏览

android - onActivityResult Uri - 创建子文件夹并获取新子文件夹的 DocumentUri

我在onActivityResult构建一个DocumentUriUsingTree. 现在我拿这个DocumentUri,构建一个DocumentFile来创建一个新文件夹。

活动结果:

resultUri == uriDirFolder 从SharedPreferenceget-Methode 获取

docTreeUri = content://com.android.externalstorage.documents/tree/3339-6133%3AStorage%20Card%2FMusic%....

dirDf 看起来像content://com.android.externalstorage.documents/tree/3339-6133%3AStorage%....dirName

df 返回父文件夹而不是新创建的文件夹

我需要DocumentFileUri从新文件夹中使用OutputStream它来将文件保存到其中。

我在这里做错了什么?

谢谢,亚历杭德罗

0 投票
1 回答
139 浏览

java - 删除文档文件后 takePersistableUriPermission 访问丢失

选择一个文件夹后

我正在接受写作许可

稍后在应用程序中,我已将文件写入用户选择的目录

问题是:当我创建一个文件时,它创建成功

但是后来我删除了它,它也被删除了

但是后来我尝试再次创建一个新文件,但出现错误

为什么删除单个文件后写入权限会丢失?

0 投票
1 回答
87 浏览

android - 遍历 DocumentFile 树

我正在尝试递归遍历 Android DocumentFile 树,但无法获取要为子文件夹返回的文件列表。当我在文件夹 URI 上尝试 listFiles() 时,我得到了每次返回的根文件列表。

为什么这不起作用?

0 投票
1 回答
54 浏览

android-studio - 如何在 Android 中读取 DocumentFile 的内容?

我向应用程序添加了一项功能,允许用户在外部存储上创建本地备份。该部分运行良好,但我无法恢复该备份。

使用 SAF,我找到了一种让用户选择他们想要恢复的文件的简单方法。他们选择的文件作为DocumentFile

如何在 API 26 及更高版本上打开 DocumentFile 并读取其内容?

到目前为止,我尝试了两件事,但都没有奏效:

1) new File(myDocumentFile.getUri().getPath())

2)我试过这个答案,但没有奏效。它也很老套,我真的不需要访问 java.io.File 我只需要一种读取内容的方法。

Google 希望我们如何阅读用户的文件?

0 投票
3 回答
52 浏览

android - 为 android sdk 30 读取存储卡上的自定义文件

我有一个应用程序可以创建在画廊中显示的自定义文件。它们不是图像或其他标准媒体文件。由于文件很大,我要求用户访问将存储文件的文件夹。

到目前为止,一切都很好。

通过 DocumentFile 读取这些文件或文件信息比通过 File 慢得多。像这样的操作

每个最多需要15ms,在读取大量文件时会累积很长时间。

处理这个问题的最佳方法是什么?还有另一种方法可以做到这一点吗?我不希望文件位于内部应用程序内存中,否则用户在卸载应用程序时可能会丢失他们的工作。

提前致谢!这让我压力很大。

0 投票
0 回答
28 浏览

java - 如何获取尚不存在的文档文件 uri?

我正在尝试使用尚不存在的给定文件名生成 Uri。我已请求用户允许访问此文件夹。

基本上,我有一棵树 Uri 和一个名字,比如“untitled.abc”。

如果给定目录中已经存在 untitled.abc,我想检查 untitled1.abc 是否存在,然后检查 untitled2.abc 等等。

我目前所拥有的不起作用,并且可能是错误的方法:

我实际上并不想创建文件,但我不知道如何为尚不存在的文件创建 uri。使用普通的 File 类很容易:

但我只是不知道如何使用 DocumentFile 和 Uri 实现相同的目标。肯定有更好的方法来做到这一点,对吧?

编辑:我想我想做的是创建一个具有给定名称和文件夹的 Uri。

Edit2:我也试过这个:

0 投票
1 回答
45 浏览

android - 使用 Android DocumentFile API 时如何列出子文件夹内容

我正在尝试切换到 DocumentFile API,因为 Android 不再允许使用 File API ...

当我选择一个文件夹时,它返回的 URI 是

现在我打电话

获取文件夹的内容。我想保留所有子文件夹的列表

我找到的第一个子文件夹具有以下 URI

我需要保存它,以便稍后我可以检查该文件夹中的文件

问题是当我尝试打电话时

在此子文件夹 uri 上,它返回与此子文件夹的父文件夹匹配的 DocumentFile

如何在此处保存子文件夹 uri,以便稍后列出此子文件夹文件?

0 投票
0 回答
56 浏览

android - 使用 DocumentFile TreeUri 在 Android 11 上的 MediaStore 中更新 DATE_MODIFIED

我正在努力使用 DocumentFile/TreeUri 更新媒体存储中的元数据。这就是我尝试这样做的方式:

它失败了,logcat 显示:

W/MediaProvider:忽略 date_modified 的突变

我究竟做错了什么?DocumentFile 是可写的,它是通过 Intent.ACTION_OPEN_DOCUMENT_TREE 接收的,并且在文件夹上调用了 takePersistableUriPermission。我还尝试在之前使用 IS_PENDING 更新条目并在之后删除:

无论出于何种原因返回也是错误的,但我看到该文件以 .pendingxxxx 为前缀,所以它似乎工作