【Android】根据URI获取文件扩展名或MimeType

关于安卓中的URI

安卓中的URI包含多种格式,可以是文件,可以是媒体库资源,可以是Resource

也可以是网络地址,或其它资源标识

这里我们主要针对文件来源的URI

安卓中通过URI访问文件主要包括三种方式

  • 文件路径
  • 媒体库资源(背后仍然是文件,但无法直接访问)
  • Resource资源

对于这三种不同的格式,我们要分别采取不同的解析方式

提取文件扩展名和MimeType
kotlin 复制代码
object UriCompat {

    const val SCHEME_HTTP = "http"
    const val SCHEME_HTTPS = "https"
  
    fun Uri.getExtensionName(): String {
        val context = getAppContext()
        val typeMap = MimeTypeMap.getSingleton()
        when (scheme) {
            ContentResolver.SCHEME_FILE -> {
                val url = Uri.fromFile(File(path)).toString()
                return MimeTypeMap.getFileExtensionFromUrl(url)
            }
            ContentResolver.SCHEME_CONTENT -> {
                val type = context.contentResolver.getType(this)
                return typeMap.getExtensionFromMimeType(type).orEmpty()
            }
            ContentResolver.SCHEME_ANDROID_RESOURCE -> {
                val retriever = MediaMetadataRetriever()
                retriever.setDataSource(context, this)
                val type = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)
                return typeMap.getExtensionFromMimeType(type).orEmpty()
            }
            SCHEME_HTTP,
            SCHEME_HTTPS -> return ""
            else -> return ""
        }
    }

    fun Uri.getMimeType(): String {
        return MimeTypeMap.getSingleton()
            .getMimeTypeFromExtension(getExtensionName())
            .orEmpty()
    }
}
相关推荐
JavaNoober19 分钟前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿1 小时前
关于ObjectAnimator
android
zhangphil2 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我3 小时前
从头写一个自己的app
android·前端·flutter
lichong9514 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013844 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我5 小时前
NekoBoxForAndroid 编译libcore.aar
android
Kaede66 小时前
MySQL中如何使用命令行修改root密码
android·mysql·adb
明君879977 小时前
Flutter 图纸标注功能的实现:踩坑与架构设计
android·ios
成都大菠萝7 小时前
Android Auto开发(3)-Audio Integration
android