Разрешить content:// Uri в фактический путь к файлу

Я создаю приложение, которое управляет библиотеками аудиокниг

Используя Intent ACTION_OPEN_DOCUMENT_TREE, чтобы позволить пользователю выбрать каталог в качестве библиотеки, в результате я получаю Uri вида: content://.

Есть ли способ преобразовать данный Uri «content://» в «file://filepath»? (если это возможно конечно) Или я могу настроить действие выбора файлов, чтобы принимать только папки, которые имеют фактический путь к файлу: //?

Большое спасибо

Обновлено: прогресс!

Мне удалось, используя распознаватель контента, найти путь вида «1407-1105: Аудиокниги» для SD-карты и «основной: Аудиокниги» для основного тома. Это кажется более читаемым, но у меня все та же проблема.

Да часто можно. В зависимости от провайдера. Разместите полную схему содержания.

blackapps 18.12.2020 21:27

Похоже content://com.android.externalstorage.documents/tree/primary‌​%3AAudiobooks

Pylvain 18.12.2020 21:33

Ну, вы можете видеть, что это каталог аудиокниг на внешнем хранилище. Каталог аудиокниг в Environment.getExternalStorageDirectory(). /storage/emulated/0/Audiobooks.

blackapps 18.12.2020 21:49

Это всего лишь пример... Я хочу преобразовать ЛЮБОЙ путь содержимого://, который имеет допустимое представление file://uri.

Pylvain 19.12.2020 09:48

Желание нормально. И не возможно. И это зависит от провайдера. И я только рассказал вам, как это сделать для одного провайдера. Это может помочь вам начать. Приятно осознавать, что я кому-то помог ;-)

blackapps 19.12.2020 12:20

Мое хорошее чувство сменилось плохим, зная, что я не сказал вам, что это не делается сейчас, когда я пытаюсь получить реальный путь от uri. Извини.

blackapps 19.12.2020 12:47
0
6
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец нашел решение! Может быть, это немного некрасиво, но, похоже, это работает!

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
}

Другие вопросы по теме