Android获取文件的mimtype记录

Android  小知识  2024年11月13日 am8:08发布1天前更新 91es.com站长
4 0 0

前言

记录一下Android中获取文件或音视频文件中的mimetype,简单记录一下,方便自己查阅。

正文

下面大概介绍3中,第一个是针对文件获取mimetype来说的,第二个和第三个是针对音视频获取mimetype来说的。

当然,可能获取的mimetype不一定相同,只作为一定的参考。

第一种

这种比较常见,也就是针对文件来说的,这部分代码来自《MediaProvider源码》,我之前在《getMimeTypeFromExtension记录》整理过。

private static void getAudioMimeType2(String path){
    //获取文件后缀扩展
    String extension = extractFileExtension(path);
    //根据后缀进行获取mimeType
    if (null != extension) {
        String mimeType =   MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase(Locale.ROOT));
    }
}

public static String extractFileExtension(String data) {
    if (data == null) return null;
    data = extractDisplayName(data);
    int lastDot = -1;
    if (null != data) {
        lastDot = data.lastIndexOf('.');
    }
    if (lastDot == -1) {
        return null;
    } else {
        return data.substring(lastDot + 1);
    }
}

public static String extractDisplayName(String data) {
    if (data == null) return null;
    if (data.indexOf('/') == -1) {
        return data;
    }
    if (data.endsWith("/")) {
        data = data.substring(0, data.length() - 1);
    }
    return data.substring(data.lastIndexOf('/') + 1);
}

第二种

这种就是开始针对音频,视频,图片来说了。

mMediaMetadataRetriever = new MediaMetadataRetriever();
mMediaMetadataRetriever.setDataSource(file.getPath());
mimeType = mMediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);

可以看《MediaMetadataRetriever解析媒体文件元数据》相关介绍。

MediaMetadataRetriever还可以解析很多信息,但不一定准确。

比如解析视频时的高宽,这里解析的不一定对的,还是需要通过MediaPlayer播放时底层上播的高宽为准。

第三种

这种就针对播放的音频和视频来说啦。一般底层播放时通过这个解析,然后选择对应的解码器解析。

try {
    MediaExtractor mediaExtractor = new MediaExtractor();
    mediaExtractor.setDataSource(path);
    int count = mediaExtractor.getTrackCount();
    if (count > 0) {
        for (int i = 0; i < count; i++) {
            Log.d(TAG, "getTrackFormat all info  : " + mediaExtractor.getTrackFormat(i));
            Log.d(TAG, "mimeType : " + mediaExtractor.getTrackFormat(i).getString("mime"));
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

这里获取存在的轨道流存在多个(count>0),比如视频或音频至少一个,也就是音频轨道和视频轨道流,也可能存在多个。比如

mimeType : video/dolby-vision
mimeType : video/hevc
mimeType : audio/mp4a-latm
mimeType : application/octet-stream
mimeType : application/octet-stream
mimeType : application/octet-stream

小结

这三种解析mimetype存在不一样,这里以多媒体测试为例哈。

path           : /sdcard/Media/sdd.m4a
第一种 mimeType : audio/mpeg
第二种 mimeType : audio/mp4
第三种 mimeType : audio/alac

也就是解析存在差异。

  1. 第一种是针对所有文件,解析文件类型mimetype;

  2. 第二种是针对音乐视频和图片,解析一些信息(mimetype,高宽等信息);

  3. 第三种是针对音乐和视频来说的解析使用哪里轨道格式(编码格式方式);

参考文章

  1. 《MediaProvider源码》

  2. getMimeTypeFromExtension记录

  3. MediaMetadataRetriever解析媒体文件元数据

 历史上的今天

  1. 2019: 乔叶:比明天年轻(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

[摘]Android IO流读写文件

一、概念文件在程序中是以流的形式来操作的。流:是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两个存储位置之间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。二、分类1、按照流向划分:输入流、输出流以内存为参照:输...

AAR文件转JAR文件的方法

什么是AARAAR(Android Archive)包是一个Android库项目的二进制归档文件。文件扩展名是.aar,但文件本身是具有以下条目的一个简单zip文件:/AndroidManifest.xml (强制)/classes.jar (强制)/res/ (强制)/R.t...

记录Ubuntu更新命令

前言简单的记录一下Ubuntu更新命令,方便自己查阅。流水账一篇。正文更新系统sudo apt update && sudo apt upgrade -y搜索包apt-cache search package获取包的相关信息apt-cache show packa...

丰子恺:渐

不为“渐”所迷,不为造物所欺,而收缩无限的时间并空间于方寸的心中。故佛家能纳须弥于芥子。使人生圆滑进行的微妙的要素,莫如“渐”;造物主骗人的手段,也莫如“渐”。在不知不觉之中,天真烂漫的孩子“渐渐”变成野心勃勃的青年;慷慨豪侠的青年“渐渐”变成冷酷的成人;血气旺盛的成人“渐渐”变成顽固的老头子。因为...

我常用的Monkey命令

Monkey的概念“猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。...

[摘]BAT脚本如何自动执行 adb shell 以后的命令

需求说明BAT脚本中执行adb shell 命令后,需要获取其返回的结果。adb shell ps | grep com.125la.test我想返回打印的值参考代码@echo offecho su > temp.txtecho 其它命令 >> temp.txt...