簡介:html
本文是《深刻Android媒體存儲服務》系列第二篇,簡要介紹媒體存儲服務掃描文件的流程。文中介紹的是 Android 4.2。java
Android 有一套媒體存儲服務,進程名是 android.process.media,主要負責把磁盤中的文件信息保存到數據庫當中,供其餘 APP 使用以及 MTP 模式使用。所以如何保持數據庫和磁盤文件保持一致很是關鍵,這個就是媒體存儲服務中 MediaScanner 的工做。android
整個流程以下圖所示,數據庫
MediaProvider(源碼位於 packages/providers/MediaProvider)裏面的 MediaScannerReceiver 類會監聽 Intent 事件,有如下 Intent 時會開始掃描磁盤文件的操做:緩存
Intent 監聽表 Intent動做 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE APP 發出的,掃描單個指定文件 Intent.ACTION_MEDIA_MOUNTED 系統發出的磁盤掛載完成通知,或者是 APP 發出,會執行全磁盤掃描 Intent.ACTION_BOOT_COMPLETED 系統發出的開機啓動完成通知,會執行全磁盤掃描,也會掃描 /system/media 目錄的媒體文件。app
Note: 手機 /system/media 目錄下有一些內置媒體文件,例如說系統內置鈴聲。這個目錄只有開機會掃描一次。框架
Note: 數據庫操做比較費 IO 資源,因此數據庫插入、更新、caozuo.html" target="_blank">刪除操做其實都是批量處理的,操做先進入一個隊列,數目達到必定程度纔會真正進行數據庫操做。ide
APP 經過如下接口查詢視頻圖片縮略圖與音樂專輯封面:ui
1 // 查詢視頻和圖片縮略圖 2 MediaStore.Video.Thumbnails.getThumbnail(cr, id, MINI_KIND); 3 4 // 查詢音樂專輯封面 5 ContentResolver().openFileDescriptor(uri, "r");
第一次取的時候會解析文件取得縮略圖或專輯封面,而後縮略圖會被緩存到磁盤,數據庫也會記錄。下次再取時,就會直接返回緩存過的圖片,不用去解析文件。spa
以上簡要介紹了媒體存儲服務掃描流程,須要深刻了解的仍是要看相應代碼。