对于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
答案 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/afile.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() }