作者:jl 在{ tagshow(event) }">Android下面,媒體庫是以ContentProvider來{ tagshow(event) }">實現的,所謂媒體庫,這裡並不是資源管理員,而是一個多媒體的{ tagshow(event) }">檔案的管理,多媒體檔案包含很多的資訊,如作者、年份、專輯、封面等等,在Android下面,這個Provider的實現是在frameworks/base/core/{ tagshow(event) }">java/android/provider/MediaStore.java packages/providers/MediaProvider/src/com/android/providers/media. frameworks/base/media/java/android/media/MediaScanner* frameworks/base/media/jni/android_media_* 這個下面的,具體媒體檔案的識別是在 external/opencore/android/mediascanner.cpp 並且為了便於手動控制什麼時候去掃描媒體檔案,以及得到掃描的訊息,這裡還要有兩個東東,一個是 MediaScannerReceiver,另外一個是 MediaScannerService。他們之間的關係如下:
當 有ACTION_BOOT_COMPLETED, ACTION_MEDIA_MOUNTED 或者ACTION_MEDIA_SCANNER_SCAN_FILE intent 請求的的時候,我們的Service就會啟動。但是它會花費很長的時間去掃描檔案,因而這是一個非同步過程,存在一個receiver,掃描的地方有兩個:外部儲存{ tagshow(event) }">裝置和/root/media這兩個地方。 /* Audio */ addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg"); addFileType("M4A", FILE_TYPE_M4A, "audio/mp4"); addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav"); addFileType("AMR", FILE_TYPE_AMR, "audio/amr"); addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb"); addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma"); addFileType("OGG", FILE_TYPE_OGG, "application/ogg"); addFileType("MID", FILE_TYPE_MID, "audio/midi"); addFileType("XMF", FILE_TYPE_MID, "audio/midi"); addFileType("RTTTL", FILE_TYPE_MID, "audio/midi"); addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi"); addFileType("IMY", FILE_TYPE_IMY, "audio/imelody"); /* Video */ addFileType("MP4", FILE_TYPE_MP4, "video/mp4"); addFileType("M4V", FILE_TYPE_M4V, "video/mp4"); addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp"); addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp"); addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2"); addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2"); addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv"); /* Image */ addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg"); addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg"); addFileType("GIF", FILE_TYPE_GIF, "image/gif"); addFileType("PNG", FILE_TYPE_PNG, "image/png"); addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp"); addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp"); /* Audio Play List */ addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl"); addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls"); addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl"); 具體的如何解析可以參見mediascanner.cpp的代碼。 |