Android 10 Информация о файле из области хранения (получить расширение файла от Uri) - PullRequest
0 голосов
/ 20 апреля 2020

Проблема

Я использую этот код для выбора одного файла на устройстве (в основном папка для загрузок).

        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
        intent.type = "*/*"
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
        intent.action = Intent.ACTION_GET_CONTENT
        startActivityForResult(Intent.createChooser(intent,getString(R.string.field_import_btn)), requestCode) 

Он работает хорошо, я понимаю Ури, и я могу прочитать файл через contentResolver.openInputStream(uri)

Проблемы возникают, когда мне действительно нужно знать, что это за файл. Другими словами, мне нужно знать, что это расширение.

Для этого я мог бы легко использовать:

String type = resolver.getType(uri);
String extention = MimeTypeMap.getSingleton().getExtensionFromMimeType(type);

Но вот проблема: если формат файла хотя бы немного реже application/octet-stream как type.

Пример: SHP aka Esri Shape file.

Другие наблюдения Находясь в Nokia 8 Android P ie (уровень 28 API)

Фактический URI, который я получаю: content://com.android.providers.downloads.documents/document/1470

В Android 10 эмуляторе для файла того же типа (Shp) я получаю: content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FRO20.shp

Что я могу использовать, чтобы получить эту последнюю часть ".shp"

Актуальный вопрос Так что в основном у меня есть два вопроса:

  1. Есть ли способ получить точное расширение файла от Uri (без преобразования mime-типа туда-сюда)?
  2. Насколько достоверно я могу утверждать, что, начиная с уровня 29 API, я могу просто разобрать расширение файла от Uri самостоятельно, без ошибок?

1 Ответ

0 голосов
/ 20 апреля 2020

попробуйте код ниже, чтобы получить тип MIME выбранного файла. Он вернется как pdf jpeg png`, передающий uri выбранного пользователем файла

  private fun getFileMimeType(uri: Uri): String? {
    return if (uri.scheme == ContentResolver.SCHEME_CONTENT) {
        val mime = MimeTypeMap.getSingleton()
        mime.getExtensionFromMimeType(context.contentResolver.getType(uri))
    } else {
        MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(File(uri.path)).toString())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...