【问题标题】:How to get selected folder path from file picker in Android [duplicate]如何从Android中的文件选择器中获取选定的文件夹路径[重复]
【发布时间】:2021-10-23 21:21:18
【问题描述】:

我正在使用文件选择器让用户决定在哪里提取特定文件。更新 Android API 后,每当用户尝试通过文件选择器将文件提取到特定文件夹时,我的应用程序在获取导出文件的路径时遇到问题,因为它返回的 uri 数据与以前不同。当用户选择 Android 系统允许的文件夹时,我的应用程序会创建新文件,并将特定文件的字节数据复制到新创建的文件中。

复制字节数据工作正常,但复制后,为了通知用户提取过程成功,我显示像 Extracted 123.png | Downloads/myPicture/123.png 这样的 toast 消息。我刚刚通过用: 字母拆分 uri 路径获得了路径,但现在 uri 路径不像以前那样包含格式。下面是我如何处理提取

if(result.resultCode == RESULT_OK) {
    val data = result.data

    if(data != null) {
        val file = current
        val uri = data.data

        if(uri == null || file == null) {
            StaticStore.showShortMessage(this, getString(R.string.file_extract_cant))
        } else {
            val pfd = contentResolver.openFileDescriptor(uri, "w")

            if(pfd != null) {
                val fos = FileOutputStream(pfd.fileDescriptor)
                val ins = file.data.stream

                val b = ByteArray(65536)
                var len: Int

                while(ins.read(b).also { len = it } != -1) {
                    fos.write(b, 0, len)
                }

                ins.close()
                fos.close()

                val path = uri.path

                if(path == null) {
                    StaticStore.showShortMessage(this, getString(R.string.file_extract_semi).replace("_",file.name))
                    return@registerForActivityResult
                }

                val f = File(path)

                val p = f.absolutePath.split(":")[1]

                StaticStore.showShortMessage(this, getString(R.string.file_extract_success).replace("_",file.name).replace("-",p))
            } else {
                StaticStore.showShortMessage(this, getString(R.string.file_extract_cant))
            }
        }
    }
}

获取提取的文件名没有问题,但是获取新创建文件的路径是有问题的。它在更新 Android API 之前工作,因为f.absolutePath 返回了创建文件的真实路径。我无法正确记住f.absolutePath 返回的内容,因为我做了这个已经很久了,但它包含: 字母旁边的完整路径,所以我只是拆分文本并从那里获取路径。现在f.absolutePath 返回document/357 或像这样。每当我尝试提取 document/358document/359 等文件时,数字都会不断变化(尤其是增加),但这肯定不是我决定导出的路径。 uri 本身也返回像 content://com.android.providers.downloads.documents/document/363 这样的格式作为字符串

文件选择器有什么变化吗? 有没有办法正确获取创建文件的完整路径?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您不应该尝试从Uri 获取File 的路径。您只需使用 Uri 本身作为对文件位置的引用。

    此外,用户自己选择了位置,所以他们已经知道它在哪里。

    【讨论】:

    • 这实际上是有道理的。我只是想确保用户将文件导出到用户想要的正确位置。好吧,uri.path 之前确实返回了文件的实际路径。如果 uri 从第一次开始就不应该显示这样的路径,我不知道为什么它之前包含这样的数据。顺便感谢您的快速回答,我想我会告诉用户导出成功
    • 它只包含某些设备和某些情况下的数据。这不是你可以 100% 依赖的东西。现在,作用域存储迫使人们更多地使用 URI,他们正在发现这一点。
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-03-01
    • 2021-12-19
    • 2013-07-08
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多