问题标签 [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.
android - 从 URI 创建一个可写的 DocumentFile
我正在尝试使File
基于 - 的文档系统适应使用的东西DocumentFile
,以便允许对 API >= 29 的外部存储读/写访问。
我让用户使用 选择SD卡根目录Intent.ACTION_OPEN_DOCUMENT_TREE
,然后按预期返回 a Uri
,然后可以使用以下方法处理:
我可以成功浏览外部存储内容,直到选定的根目录。都好。
但是我需要做的是在所选(子)文件夹中写入一个任意文件,这就是我遇到问题的地方。
除了openOutputStream()
我接到的电话:
java.io.FileNotFoundException: Failed to open for writing: java.io.FileNotFoundException: open failed: EISDIR (Is a directory)
这让我有点困惑,但“找不到文件”部分表明我可能需要先创建空白输出文件,所以我尝试这样做,例如:
我得到一个java.io.IOException
:
这对我来说没有意义,因为树应该是可写的。
对于它的价值,Uri
我从Intent.ACTION_OPEN_DOCUMENT_TREE
看起来像这样回来:
content://com.android.externalstorage.documents/tree/0B07-1910%3A
有趣的是,当我使用它Uri
来创建DocumentFile
要浏览的对象时,使用documentFile = DocumentFile.fromTreeUri(context, uri)
,然后documentFile.getURI().toString()
看起来像:
content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3A
即,它的末尾附加了一些东西。
然后,我进入应该是可写文件夹(如“下载”),并尝试如上所述创建可写文件。“下载”文件夹获取Uri
:
content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3ADownload
然后Uri
我使用的 fortoPath
是:
content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3ADownload/Testing.tmp
这会导致前面描述的问题,试图创建它。
实际上,我还没有找到任何关于在存储访问框架限制下编写任意文件的体面信息。
我究竟做错了什么?谢谢。:)
android - 如何从子 Uri 获取子 TreeDocumentFile?
[根据评论重写]
简化示例:
rootUri
由 获得ACTION_OPEN_DOCUMENT_TREE
。然后我创建一个文件夹(或更多嵌套文件夹):
我存储childUriStr
到本地数据库中,以便以后重新创建childTree
. childUriStr
包含所需的所有元素:authority
、rootTree
documentId 和childTree
documentId。所以childTree
可以通过以下方式重新创建:
但是TreeDocumentFile()
构造函数是包私有的,只能在内部使用,并且由DocumentFile.fromTreeUri()
.
解决方法 1(慢):
解决方法 2(有关 rootTree 的信息丢失):
在这里,树种在子文件夹中,所以我不能使用childAsRootTree.parent
,不能解析名称childAsRootTree.name == null
,可能还有其他一些小问题 - 绝对不推荐。DocumentFile.fromSingleUri()
与TreeDocumentFile
.
解决方法 3(要维护的其他代码):
基于编写我自己的包装器TreeDocumentFile
用例(无需阅读)
请注意,上面描述的是一个简化的例子。一个与我类似的潜在用例是:用户通过应用内文件资源管理器选择单个文件或包含多个文件的文件夹(步骤 1)。应用内文件资源管理器的根文件通过ACTION_OPEN_DOCUMENT_TREE
. 用户可以处理文件,然后如果用户在步骤 1 中选择了文件夹,则处理后的文件将保存在同一目录中,如果用户在步骤 1 中选择了文件,则处理后的文件将保存在新文件夹中的新文件夹中(这需要访问选定的文件)。用户稍后可以决定选择不同的保存文件排列方式。
java - 如何从 Document Uri 获取孩子的 DocumentFile
假设以下文件夹结构:
鉴于下面列出的 Uri,如何获取位于/Test/Example
路径中的目录的 DocumentFile,其中 Test 和 Example 是动态选择的目录?
我需要 /Test/Example 目录的 DocumentFile,因为我需要进一步遍历树并查找/检查是否存在其他目录,例如/Test/Example/Dir1/Dir2/test.txt
,但在运行时我不知道目录的名称是什么。
android - 如何通过 DocumentContract.moveDocument() 将 mediastore 内容项移动到另一个目录?
由于 Android 通过范围存储访问强制使用存储访问框架,因此应用程序无法使用直接 java.io.file 操作来移动文件。
目的是将某些从 mediastore 数据库中查询到的特定媒体项移动到另一个特定目录(源文件的同一分区),该目录用户已授予应用程序 rw 权限。
但是,当我尝试使用方法创建 DocumentFile 实例时
在这种情况下,创建的实例的父 DocumentFile 为 null。以及方法
需要源父级移动文档文件。我知道我可以通过读/写 IO 流将源复制到目标,但这并不有效。那么,我怎样才能以推荐的方式做到这一点呢?
另一个问题是,如果有办法将内容从 mediastore 移动到另一个地方,如何在不删除底层文件实体的情况下将其从数据库中删除?
android - 如何将 DocumentsProvider.moveDocument 与 TreeUri 一起使用?
我想将 DocumentFile 从一个位置移动到另一个位置。Uris 通过 ACTION_OPEN_DOCUMENTTREE 获取并存储。
但是,当我尝试:
我收到一个错误:
我还没有找到将 TreeUri 转换为普通的方法。这是问题吗?如果是这样,它是如何完成的?
android - 从 Uri 创建 DocumentFile
使用 SAF,我在文件提供程序中创建了一个文件。然后在 onActivityResult 中,我保留对该文件的权限并将 Uri 存储到共享首选项中。后来我将数据写入文件。
这似乎有效。除非文件被删除/移动/重命名或基本上不再存在。
我可以使用以下方法检查它是否存在:
但这并不能解决我无法使用 写入数据的问题contentResolver.openOutputStream(uri)
,因为我得到了FileNotFoundException
.
有没有办法使用存储的 Uri 创建文件,而我仍然应该保留权限?
documentfile - DocumentFile.createFile() 在某些 Android 10 设备上失败
DocumentFile.createFile() 在某些 Android 10 设备上返回 null ( java.lang.IllegalArgumentException )。
其中大部分是华为设备:VOG-L29、MAR-LX1A、...
一些用户报告了这一点,但我不知道为什么。我没有遇到此问题的设备,因此无法对其进行测试。
它在大多数设备上都可以正常工作。
有没有人解决过这个问题?
从用户收到的日志:
android - /tree/primary 与 /document/primary
我正在学习如何使用 SAF。在我的演示应用程序中,我发现 uri 路径可能是/tree/primary
and /document/primary
。
我想知道有什么区别?
android - 在 Android 中更快地对 DocumentFiles 数组进行排序
在这种情况下,我必须使用此方法对数百个 DocumentFile 对象进行排序:
但是,这花费的时间太长,大约需要 MINUTE 200 个 DocumentFile 对象。我无法理解这种生命课程如此缓慢。它必须更多地用于最近的范围存储更改。
任何人都知道如何更快地完成这个排序过程?
java - 如何在 Android Q 中使用 DocumentFile 删除文件?
用文档uri删除文件的方法
Logcat 错误
奇怪的是,对于某些文件,这是可行的,而对于某些文件,则会出现此错误,并且所有音频文件都位于内部存储的同一位置。
编辑
mediaUri 的值通过以下方式获得ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)));
此外,我尝试删除的文件也不是由我的应用创建的