如何使用scheme ==“ android.resource”从URI中获取MIME类型

时间:2018-08-10 19:11:26

标签: android

当方案为“内容”或“文件”时,我知道如何从URI获取MIME类型。但是,当方案为“ 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”)?

1 个答案:

答案 0 :(得分: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
}