Как получить тип MIME из URI с помощью scheme == "android.resource"

Я знаю, как получить тип MIME из URI, когда используется схема «содержимое» или «файл». Однако я не могу найти никакого решения, когда используется схема "android.resource". Например, у меня res/raw/video.mp4.

val uri = Uri.parse("android.resource://$packageName/${R.raw.video}")

URI хорош, потому что я могу сделать следующее

videoView.setVideoURI(uri)
videoView.start()

Учитывая такой URI, как я могу получить его mime-тип (в данном случае он должен быть "video / mp4")?

Я не думаю, что это возможно, извините.

CommonsWare 10.08.2018 23:38
2
1
769
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать MediaMetadataRetriever для медиафайла:

val uri = Uri.parse("android.resource://$context.packageName/${R.raw.video}")
val retriever = MediaMetadataRetriever()
val mimeType = try {
            retriever.setDataSource(context, uri)
            retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)
        } catch (e: Exception) {
            null
        }
Log.d(TAG, "MIME type: $mimeType")

Для любого другого типа:

val resId = R.raw.video
val resUri = Uri.parse("android.resource://${context.packageName}/$resId")

val mimeType = tryGetMediaMimetype(context, resUri)
        ?: tryGetImageMimetype(context.resources, resId)
        ?: tryGetMimeTypeFromExtension(context.resources, resId)
Log.d(TAG, "MIME type: $mimeType")

...

fun tryGetMediaMimetype(context: Context, uri: Uri): String? {
    val retriever = MediaMetadataRetriever()
    return try {
        retriever.setDataSource(context, uri)
        retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)
    } catch (e: Exception) {
        null
    }
}

fun tryGetImageMimetype(resource: Resources, resId: Int): String? {
    val options = BitmapFactory.Options()
    options.inJustDecodeBounds = true
    return try {
        BitmapFactory.decodeResource(resource, resId, options)
        options.outMimeType
    } catch (e: OutOfMemoryError) {
        return null
    }
}

fun tryGetMimeTypeFromExtension(resource: Resources, resId: Int): String? {
    val value = TypedValue()
    resource.getValue(resId, value, true)
    val fileName = value.string.toString()

    val dotIndex = fileName.lastIndexOf(".")
    val extension = if (dotIndex >= 0) {
        fileName.substring(dotIndex + 1)
    } else null

    return if (extension != null) {
        MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
    } else null
}

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