Я создаю приложение, которое управляет библиотеками аудиокниг
Используя Intent ACTION_OPEN_DOCUMENT_TREE, чтобы позволить пользователю выбрать каталог в качестве библиотеки, в результате я получаю Uri вида: content://.
Есть ли способ преобразовать данный Uri «content://» в «file://filepath»? (если это возможно конечно) Или я могу настроить действие выбора файлов, чтобы принимать только папки, которые имеют фактический путь к файлу: //?
Большое спасибо
Обновлено: прогресс!
Мне удалось, используя распознаватель контента, найти путь вида «1407-1105: Аудиокниги» для SD-карты и «основной: Аудиокниги» для основного тома. Это кажется более читаемым, но у меня все та же проблема.
Похоже content://com.android.externalstorage.documents/tree/primary%3AAudiobooks
Ну, вы можете видеть, что это каталог аудиокниг на внешнем хранилище. Каталог аудиокниг в Environment.getExternalStorageDirectory(). /storage/emulated/0/Audiobooks.
Это всего лишь пример... Я хочу преобразовать ЛЮБОЙ путь содержимого://, который имеет допустимое представление file://uri.
Желание нормально. И не возможно. И это зависит от провайдера. И я только рассказал вам, как это сделать для одного провайдера. Это может помочь вам начать. Приятно осознавать, что я кому-то помог ;-)
Мое хорошее чувство сменилось плохим, зная, что я не сказал вам, что это не делается сейчас, когда я пытаюсь получить реальный путь от uri. Извини.
Наконец нашел решение! Может быть, это немного некрасиво, но, похоже, это работает!
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
}
Да часто можно. В зависимости от провайдера. Разместите полную схему содержания.