【问题标题】:How to convert an absolute path String to a directory in tree Uri format如何将绝对路径字符串转换为树 Uri 格式的目录
【发布时间】:2020-06-25 22:08:42
【问题描述】:

如果我尝试解析 "String path=/storage/emulated/0/Somefolder/" 类型的字符串路径,则方法 Uri.parse 会生成一个不是 Android tree UriUri

因此,如果我尝试使用类似的东西获取DocumemtFile 列表

String path="/storage/emulated/0/Somefolder/"
DocumentFiles[] fileslist=DocumentFile.fromTreeUri(this, Uri.parse(path)).listFiles();

我收到 无效 URI 错误。

如果我尝试使用 DocumentFile.fromSingleUri 也不能正常工作。

如何从字符串路径中正确获取 tree Uri

我找到了如何使用操作 Intent 获取 treeuri,但我需要以编程方式执行此操作,而不需要强制用户手动选择文件夹。

【问题讨论】:

    标签: android uri storage-access-framework android-storage


    【解决方案1】:

    如何从字符串路径中正确获取树 Uri?

    这是不可能的,抱歉。

    为了使DocumentFile 指向文件系统路径,请使用fromFile()。请记住:

    • 您需要在清单中的 <application> 元素上使用 android:requestLegacyExternalStorage="true" 才能读取 Android 10+ 上的任意文件系统路径

    • 一旦您的targetSdkVersion 在明年某个时候达到 30,您将失去对 Android 11+ 上任意文件系统路径(尽管有该属性)的写入权限

    【讨论】:

    • 所以不管已经请求的权限加上路径上已经使用的令牌。我不能遍历它的子文件夹来写东西,也不能以任何方式使用显式路径进行操作。真是一团糟!在最好的假设中,这将破坏用户对所有内容的持续请求的体验,并且某些应用程序肯定不再可行。
    • @AndreaF:如果您使用ACTION_OPEN_DOCUMENT_TREE 请求一棵树,您可以获取持久权限并无限期地使用该树(禁止用户删除它或其他什么)。
    • 如果您只需要在选择的目录上操作而不需要生成子文件夹以及在那里写入和列出文件,这将起作用。如果您需要在其子文件夹上工作,SAF 会显示其所有限制,如果没有用户每次在您必须工作的每个子文件夹上进行干预,很多事情都是不可能的(例如,看看在这种情况下会发生什么stackoverflow.com/questions/62375696/…)。 (除非我遗漏了什么)
    • 没有。如果用户选择了一个带有 ACTION_OPEN_DOCUMENT_TREE 的目录,您可以对该目录执行您想要的操作,例如创建文件夹、子文件夹、子子文件夹等以及随处可见的文件。您可以使用 DocumentFile 或 DocumentsContract 来做到这一点。完全没有用户干预。
    • @blackapps 对目录中已经存在的子文件夹没有限制它不能运行很多操作仅限于明确选择的文件夹,正如您在我的其他链接问题中看到的那样,您无法获得文件夹层次结构,因为孩子总是返回手动选择的父亲层次结构,直到现在我还没有找到任何有效的解决方法,并且 DocumentsContract 也不起作用
    【解决方案2】:

    如果用户曾经使用 ACTION_OPEN_DOCUMENT_TREE 选择了 /storage/emulated/0,那么您可以自己非常轻松地为 /storage/emulated/0/myfolder/mysubfolder/myfile 这样的路径构建 uri。并使用 uri 进行完全访问。

    这有点像getRealPathFromUri() 这样的函数的逆向。

    请记住,这些函数是被诅咒的!

    【讨论】:

    • 如果我使用ACTION_OPEN_DOCUMENT_TREE 构造 Uri 的大部分点都是无效的,因为我可以直接使用它,但我想以编程方式在路径中操作,以便根据生成的一些指令创建文件夹结构无需强制用户手动执行大量操作。
    猜你喜欢
    • 2022-08-17
    • 2015-07-23
    • 2021-10-02
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多