将 content:// Uri 解析为实际文件路径

时间:2020-12-18 20:04:38

标签: android

我正在构建一个管理有声书库的应用

使用 Intent ACTION_OPEN_DOCUMENT_TREE 让用户选择一个目录作为库,我得到了一个形式为 : content:// 的 Uri。

有没有办法将给定的“content://”Uri 转换为“file://filepath”? (当然,如果可能的话) 或者我可以调整文件选择器活动以仅接受具有实际 file:// 路径的文件夹吗?

非常感谢

编辑:进展!

我设法使用内容解析器为 SD 卡找到了“1407-1105:Audiobooks”形式的路径,为主卷找到了“primary:Audiobooks”形式的路径。这似乎更具可读性,但我仍然有同样的问题。

1 个答案:

答案 0 :(得分:0)

终于找到解决办法了!也许它有点难看,但似乎确实有效!

fun resolveContentUri(uri:Uri): String {

    val docUri = DocumentsContract.buildDocumentUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri))
    val docCursor = context.contentResolver.query(docUri, null, null, null, null)
    
    var str:String = ""

    // get a string of the form : primary:Audiobooks or 1407-1105:Audiobooks
    while(docCursor!!.moveToNext()) {
        str = docCursor.getString(0)
        if(str.matches(Regex(".*:.*"))) break //Maybe useless
    }
    
    docCursor.close()

    val split = str.split(":")
    
    val base: File =
        if(split[0] == "primary") getExternalStorageDirectory()
        else File("/storage/${split[0]}")

    if(!base.isDirectory) throw Exception("'$uri' cannot be resolved in a valid path")

    return File(base,split[1]).canonicalPath
}