从DocumentFile获取普通文件是否可行?

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个回答

5
以下代码返回一个Uri,可用于创建对应文档树的DocumentFile,它不一定表示文件系统上的目录。文档树的表示方式由用户选择的DocumentsProvider决定,该提供程序可以使用数据库、REST调用服务器等任何方式来表示树形结构。
我想知道是否可以从DocumentFile获取java.io.File。
不行,因为没有文件。

非常感谢快速回答。看起来我们不得不走另一条路——更改方法,使用低效的DocumentFile而不是File。 - Hong

1

是的,但可能地址是ASCII编码的,您需要将其转换为UTF-8以避免出现像“%2F”这样的文本字符串。我建议使用“val decoded = URLDecoder.decode(input,“utf-8”)”


0

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

使用 SimpleStorage,您可以将DocumentFile转换为java.io.File

val file: File? = documentFile.toRawFile(context)?.takeIf { it.canRead() }

-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 的帖子完全相反。


1
感谢您的帮助。您如何将DocumentFile的实例转换为java.io.File? - Hong
1
好的。但你没有发布相应的文件系统路径。我也问了那个。类似于/storage/emulated/0/DCIM或者/sdcard/DCIM。 - greenapps
“storage/emulated/0/DCIM” 是您要查找的内容吗?这只是一个示例。目录可以是用户选择的任何一个。应用程序唯一拥有的是 Uri。期待您进一步的阐述。 - Hong
抱歉我的无知,我不知道如何得到你所要求的内容。任何提示将不胜感激。 - Hong
什么是问题?您可以使用ACTION_OPEN_DOCUMENT_TREE选择DCIM目录。现在,您不能选择不同的目录吗?选择树中更深的某个目录。 - greenapps
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接