Android獲取文件類型

一、 通過(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容