一、 通過(guò)文件名后綴:
文件命名后綴如.jpg、.png等等一般即為文件類型,但有些時(shí)候不能保證文件后綴名一定有效,所以嘗試將后綴轉(zhuǎn)換成對(duì)應(yīng)mime類型,方法如下:
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix);
如果轉(zhuǎn)換結(jié)果返回為nul,則可以認(rèn)為后綴名不是有效的文件類型。
二、使用ContentResolver和Uri來(lái)查詢:
public final @Nullable String getType(@NonNull Uri url)
此方法實(shí)際是由查找對(duì)應(yīng)的ContentProvider來(lái)獲取文件類型,會(huì)先在本進(jìn)程內(nèi)查找,失敗后通過(guò)ActivityManagerService跨進(jìn)程查找。
三、使用MediaMetadataRetriever查詢:
首先要設(shè)置數(shù)據(jù)源,常用的數(shù)據(jù)設(shè)置有兩種方式:
1)通過(guò)文件路徑設(shè)置
public void setDataSource(String path)
2)通過(guò)文件Uri設(shè)置
public void setDataSource(Context context, Uri uri)
無(wú)論哪種設(shè)置方式,其本質(zhì)都是獲取文件描述符FileDescriptor,然后調(diào)用以下方法:
public native void setDataSource(FileDescriptor fd, long offset, long length)
設(shè)置之后直接調(diào)用extractMetadata方法,傳入keyCode為MediaMetadataRetriever.METADATA_KEY_MIMETYPE,即可得到文件的mime類型。
public native String extractMetadata(int keyCode);
四、 使用Files.probeContentType方式:
public static String probeContentType(Path path)
這個(gè)方法是JAVA 1.6版本以后提供的,但是在Android中需要Api 26以上才可以使用,方法中的參數(shù)path可以使用File內(nèi)的toPath()方法獲取。
public Path toPath()
五、 通過(guò)讀取文頭部字節(jié)判斷:
5.1. 使用java中URLConnection提供的“類型猜測(cè)”方法查詢:
- 1) 通過(guò)文件名查詢類型
public static String guessContentTypeFromName(String fname)
此方法與方法一查詢mime方法本質(zhì)相同,最終都會(huì)調(diào)用MimeUtils.guessMimeTypeFromExtension方法。MimeUtils中提前緩存了后綴與mime類型的映射關(guān)系(先嘗試從特定的用戶表中加載,如果失敗則加載默認(rèn)的內(nèi)置表),于是根據(jù)傳入的后綴查詢對(duì)應(yīng)mime。
- 2) 讀取文件流判斷類型
public static String guessContentTypeFromName(String fname)
先讀取數(shù)據(jù)流的前16個(gè)字節(jié),根據(jù)這16個(gè)字節(jié)可以判斷出絕大部分的文件類型。不過(guò)URLConnection下的這個(gè)方法只提供網(wǎng)絡(luò)傳輸中常用的幾種類型判斷。
5.2. 根據(jù)前16個(gè)字節(jié)進(jìn)行判斷
以下只列出部分常用類型的應(yīng)對(duì)關(guān)系,更多類型可以搜索“根據(jù)文件頭獲取文件類型”查詢:
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
如果確定可轉(zhuǎn)為Bitmap,可以直接使用BitmapFactory.Options中的outMimeType屬性。
github: https://github.com/FirstLetterZ/Dependence/tree/master/file
依賴版本: 'io.github.firstletterz:tool-file:0.0.2'
2021-08-10