8

对于 Android,以下代码返回一个 Uri,可用于创建与目录对应的 DocumentFile。

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_CUSTOM_FOLDER);

由于库的许多方法需要一个参数是 java.io.File,我想知道是否可以从 DocumentFile 中获取 java.io.File。

例如,返回的文档树 Uri treeUri 如下:

treeUri.getPath():/tree/primary:DCIM/deeper/evendeeper
treeUri.toString(): content://com.android.externalstorage.documents/tree/primary%3ADCIM%2Fdeeper%2Fevendeeper

以下是 ADM 中显示的目录: 在此处输入图像描述

4

4 回答 4

4

下面的代码返回一个Uri,可以用来创建一个目录对应的DocumentFile

不,不是的。它返回一个Uri可用于创建DocumentFile与文档树相对应的一个。它不需要代表文件系统上的目录。文档树的表示位置和方式取决于DocumentsProvider用户选择。该提供者可以做任何它想要表示树的事情(例如,使用数据库,使用对服务器的 REST 调用)。

我想知道是否可以从 DocumentFile 中获取 java.io.File。

不,因为没有文件。

于 2016-09-19T16:24:23.193 回答
1

是的,但地址可能是 ASCII 格式,您必须将其转换为 UTF-8 以避免出现“%2F”之类的文本字符串。我建议使用“val decoded = URLDecoder.decode (input, utf-8 ")”

于 2021-02-18T09:43:28.133 回答
0

是的你可以。对于 API 30+,您需要完全存储访问权限。对于 API 28-,您只需要Manifest.permission.READ_EXTERNAL_STORAGE.

使用SimpleStorage,您可以转换DocumentFilejava.io.File

val file: File? = documentFile.toRawFile(context)?.takeIf { it.canRead() }
于 2021-06-10T06:43:11.403 回答
-3
I am wondering if one can get a java.io.File from a DocumentFile.

是的,大多数情况下你可以。如果用户从主存储或辅助存储中选择“文件”,则可以,因为内容方案与文件或目录的文件路径之间存在一对一的关系。

但是如果你真的需要 java.io.File 你最好使用文件选择器。

[更新]

content://com.android.externalstorage.documents/tree/primar%3ADCIM%2Fdeeper%2Fevendeeper 
content://com.android.externalstorage.documents/tree/primary:DCIM/deeper/evendeeper 

如果那个例如对应于

 /storage/emulated/0/DCIM/deeper/evendeeper. 

 content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fcom.aaaa.org%2Ffiles%2Fafile.txt
 content://com.android.externalstorage.documents/tree/primary:Android/com.aaaa.org/files/afile.txt

转化为

/storage/emulated/0/Android/com.aaa.org/files/afil‌​e.txt

如果你认识一个你就认识他们,那么接下来是:存在一对一的关系。

转换唯一需要做的就是替换content://com.android.externalstorage.documents/tree/primary‌​:/storage/emulated/0/

这减少了确定的问题/storage/emulated/0/

为此,您必须让用户为所选内容方案选择文件系统路径的根目录。如果无法选择,通常可以通过设备上的文件资源管理器应用程序找到。最后,您可以输入路径。

与 Android SAF(存储访问框架)中所做的完全相反:从 TreeUri或其他带有标签的帖子中获取特定的文件 Uri storage-acccess-framework

于 2016-09-19T17:14:50.357 回答