美文网首页
Android获取文件类型

Android获取文件类型

作者: 周_0717 | 来源:发表于2021-08-12 09:50 被阅读0次

一、 通过文件名后缀:

文件命名后缀如.jpg、.png等等一般即为文件类型,但有些时候不能保证文件后缀名一定有效,所以尝试将后缀转换成对应mime类型,方法如下:

String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix);

如果转换结果返回为nul,则可以认为后缀名不是有效的文件类型。

二、使用ContentResolver和Uri来查询:

public final @Nullable String getType(@NonNull Uri url)

此方法实际是由查找对应的ContentProvider来获取文件类型,会先在本进程内查找,失败后通过ActivityManagerService跨进程查找。

三、使用MediaMetadataRetriever查询:

首先要设置数据源,常用的数据设置有两种方式:

1)通过文件路径设置
public void setDataSource(String path)
2)通过文件Uri设置
public void setDataSource(Context context, Uri uri)

无论哪种设置方式,其本质都是获取文件描述符FileDescriptor,然后调用以下方法:

public native void setDataSource(FileDescriptor fd, long offset, long length)

设置之后直接调用extractMetadata方法,传入keyCode为MediaMetadataRetriever.METADATA_KEY_MIMETYPE,即可得到文件的mime类型。

public native String extractMetadata(int keyCode);

四、 使用Files.probeContentType方式:

public static String probeContentType(Path path)

这个方法是JAVA 1.6版本以后提供的,但是在Android中需要Api 26以上才可以使用,方法中的参数path可以使用File内的toPath()方法获取。

public Path toPath() 

五、 通过读取文头部字节判断:

5.1. 使用java中URLConnection提供的“类型猜测”方法查询:

  • 1) 通过文件名查询类型
public static String guessContentTypeFromName(String fname)

此方法与方法一查询mime方法本质相同,最终都会调用MimeUtils.guessMimeTypeFromExtension方法。MimeUtils中提前缓存了后缀与mime类型的映射关系(先尝试从特定的用户表中加载,如果失败则加载默认的内置表),于是根据传入的后缀查询对应mime。

  • 2) 读取文件流判断类型
public static String guessContentTypeFromName(String fname)

先读取数据流的前16个字节,根据这16个字节可以判断出绝大部分的文件类型。不过URLConnection下的这个方法只提供网络传输中常用的几种类型判断。
5.2. 根据前16个字节进行判断
以下只列出部分常用类型的应对关系,更多类型可以搜索“根据文件头获取文件类型”查询:

JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3

六、BitmapFactory.Options

如果确定可转为Bitmap,可以直接使用BitmapFactory.Options中的outMimeType属性。

github: https://github.com/FirstLetterZ/Dependence/tree/master/file
依赖版本: 'io.github.firstletterz:tool-file:0.0.2'

2021-08-10

相关文章

网友评论

      本文标题:Android获取文件类型

      本文链接:https://www.haomeiwen.com/subject/zzmveltx.html