当方案为“内容”或“文件”时,我知道如何从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”)?
答案 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
}