我正在构建一个管理有声书库的应用
使用 Intent ACTION_OPEN_DOCUMENT_TREE 让用户选择一个目录作为库,我得到了一个形式为 : content:// 的 Uri。
有没有办法将给定的“content://”Uri 转换为“file://filepath”? (当然,如果可能的话) 或者我可以调整文件选择器活动以仅接受具有实际 file:// 路径的文件夹吗?
非常感谢
编辑:进展!
我设法使用内容解析器为 SD 卡找到了“1407-1105:Audiobooks”形式的路径,为主卷找到了“primary:Audiobooks”形式的路径。这似乎更具可读性,但我仍然有同样的问题。
答案 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
}