Android Kotlin ACTION_CREATE_文档提供了非工作URI

Android Kotlin ACTION_CREATE_文档提供了非工作URI,android,kotlin,Android,Kotlin,我正在尝试将SQLiteDatabase导出到文件。我正在使用ACTION_CREATE_DOCUMENT意图获取文件。它向我显示对话框,正确填写所有内容,并以零大小创建文件。我可以使用文件管理器查看文件。然而,当我检查onActivityResult时,传递给这个方法的Uri看起来是坏的。当我尝试使用Uri.path创建文件时,会出现IOExceptions(找不到文件) val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {

我正在尝试将SQLiteDatabase导出到文件。我正在使用ACTION_CREATE_DOCUMENT意图获取文件。它向我显示对话框,正确填写所有内容,并以零大小创建文件。我可以使用文件管理器查看文件。然而,当我检查onActivityResult时,传递给这个方法的Uri看起来是坏的。当我尝试使用
Uri.path创建文件时,会出现IOExceptions(找不到文件)

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_DEFAULT)
    type = "application/x-sqlite3"
    putExtra(Intent.EXTRA_TITLE, "export.db")

    putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOCUMENTS)
}
startActivityForResult(intent!!,4711)
我可以看到正确的文件名,如果我在对话框中按
save
,我将以
Activity.RESULT\u OK
结束。但是uri看起来像
content://com.android.providers.downloads.documents/document/26
和uri.path是
/document/26
,这给了我IO异常

override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
        super.onActivityResult(requestCode, resultCode, resultData)

        if (requestCode == 4711 && resultCode == Activity.RESULT_OK) {
            resultData?.data?.also { documentUri ->

                try {
                    val db = DBBackend(context!!)
                    val dbFile = File(db.getDatabaseFilename())

                    var exportFile = File(documentUri.path)
                    exportFile.createNewFile()
                    dbFile.copyTo(exportFile)
                }
                catch( error : Exception )
                {
                    Log.e("FileError", error.toString() )
                    Toast.makeText(context!!,"error: ${error.toString()}", Toast.LENGTH_LONG).show()
                }
            }
        }
    }
这对我来说毫无意义。 在下载文件夹中获取可写文件的正确方法是什么


谢谢你的提示

嗨。您可以在获取此异常的位置添加日志猫吗?您可以在文件室的上下文中,使用
操作\u创建\u文档
,在中找到数据库导入/导出的完整工作示例。FWIW,它包含在中。这是一个非常正常的uri。而且,您不能将它的一部分用于File类,因为它不是文件系统路径。您应该为uri打开一个输出流,然后将数据库内容写入其中。