【问题标题】:Android: Unable to retrieve the Uri of a folderAndroid:无法检索文件夹的 Uri
【发布时间】:2020-05-30 21:55:06
【问题描述】:

我有一个应用程序,它允许用户通过 Android 文件选择器Intent.ACTION_OPEN_DOCUMENT_TREE 选择一个文件夹,然后在所选文件夹中创建一个 ZIP 文件,该文件最终将被共享。 我可以通过 OnActivityResult 函数中的Uri uri = data.getData(); 检索所选文件夹 Uri。

这可行,我选择了 SD 卡的示例 Uri 如下所示:content://com.android.externalstorage.documents/tree/15E6-0F1A%3A

现在我需要在应用程序缓存文件夹中临时存储一个 ZIP 文件,然后再将其共享。但是我很难访问缓存文件夹的 Content Uri?

我认为我需要做的是:

File filePath = new File(this.getCacheDir(), "");
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", filePath);

然后将 Uri 发送到创建和共享 ZIP 文件的函数,但使用文件夹调用 FileProvider.getUriForFile 会导致应用程序崩溃。 java.lang.StringIndexOutOfBoundsException

只要我在缓存文件夹中创建一个文件并使用此文件句柄调用FileProvider.getUriForFile,我就会得到一个正确的 Uri:

File filePath = new File(this.getCacheDir(), "");
File newFile = new File(filePath, "tmpFileName");
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", newFile);

所以看起来 FileProvider.getUriForFile 不能处理文件夹?

我上下搜索,但不知何故,我发现的所有内容都是关于文件的,我需要一个文件夹 Uri。我尝试过 DocumentFile 和 File 等替代方案,但我最终得到的只是“文件”Uris,而不是“内容”Uris。

因此我的问题是,有谁知道从文件夹中获取内容 Uri 的方法,或者更具体地说,我如何获取 this.getCacheDir()content Uri?

【问题讨论】:

    标签: android uri


    【解决方案1】:

    我可以通过 Uri uri = data.getData(); 检索所选文件夹 Uri在 OnActivityResult 函数中。

    那不是文件夹。它是一个文档树。请特别注意,它不必代表文件系统上的目录。

    现在我需要在应用程序缓存文件夹中临时存储一个 ZIP 文件,然后再将其共享出去

    getCacheDir() 中创建一个指向所需目标文件的File 对象,然后使用标准Java 文件I/O 复制或使用该File 对象创建您的ZIP 文件。请注意,此操作不需要 Uri 值。

    所以看起来 FileProvider.getUriForFile 不能处理文件夹?

    正确。

    然后将 Uri 发送到创建和共享 ZIP 文件的函数

    您共享的Uri 将指向 ZIP 文件。您不需要以某种方式指向getCacheDir()Uri。您可以使用普通文件 I/O 来创建 ZIP 文件,而不涉及 Uri

    如何获取this.getCacheDir()的内容Uri?

    Android 中没有任何东西真正支持这个概念,你也不需要它。

    【讨论】:

    • 感谢您的回复@CommonsWare,非常感谢。确认我确实遇到了死胡同,这肯定可以避免我在这方面浪费更多时间。我希望我可以重用我现有的 ZIP-and-send 例程,我经历了很大的痛苦,以便从文件选择器提供的“文档树”中获取最终的 ZIPoutputstream。但在这种情况下,我将基于 File 对象复制 ZIP 和发送逻辑,无论如何肯定会简单得多。
    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2019-12-19
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多