是否可以从DocumentFile获取常规文件?

时间:2016-09-19 16:20:11

标签: android android-file storage-access-framework documentfile

对于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中显示的目录: enter image description here

4 个答案:

答案 0 :(得分:1)

  

以下代码返回一个Uri,可用于创建与目录

对应的DocumentFile

不,它没有。它返回putchar('A' + 1),可用于创建与文档树对应的ws://127.0.0.1:8000/socket.io/?EIO=3&transport=polling&t=1474301877690-0。它不需要表示文件系统上的目录。文档树的表示位置和方式取决于用户选择的Uri。该提供者可以做任何想要表示树的事情(例如,使用数据库,使用REST调用服务器)。

  

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

不,因为没有文件。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

I am wondering if one can get a java.io.File from a DocumentFile.

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

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

[UPDATE]

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 (Storage Access FrameWork): Get particular file Uri from TreeUri或标记为storage-acccess-framework的其他帖子完全相反。

答案 3 :(得分:0)

是的,你可以。对于 API 30+,您需要 full storage access。对于 API 28-,您只需要 Manifest.permission.READ_EXTERNAL_STORAGE

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

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