【发布时间】: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/358、document/359 等文件时,数字都会不断变化(尤其是增加),但这肯定不是我决定导出的路径。 uri 本身也返回像 content://com.android.providers.downloads.documents/document/363 这样的格式作为字符串
文件选择器有什么变化吗? 有没有办法正确获取创建文件的完整路径?
【问题讨论】: