Android 媒體存儲服務(二)

Android 媒體存儲服務

簡介html

本文是《深刻Android媒體存儲服務》系列第二篇,簡要介紹媒體存儲服務掃描文件的流程。文中介紹的是 Android 4.2。java

Android 有一套媒體存儲服務,進程名是 android.process.media,主要負責把磁盤中的文件信息保存到數據庫當中,供其餘 APP 使用以及 MTP 模式使用。所以如何保持數據庫和磁盤文件保持一致很是關鍵,這個就是媒體存儲服務中 MediaScanner 的工做。android

整個流程以下圖所示,數據庫

監聽 Intent 事件

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 目錄下有一些內置媒體文件,例如說系統內置鈴聲。這個目錄只有開機會掃描一次。框架

開始文件掃描

  1. 以全磁盤掃描爲例,接着 MediaProvider 裏面的 MediaScannerService 服務啓動,開始調用 MediaScanner(frameworks/base/media/java/android/media/MediaScanner.java) 掃描磁盤。MediaScanner 控制整個掃描流程,會經過 JNI 調用相應 C++ 代碼遍歷整個磁盤的目錄樹,並調用 libstagefright 多媒體框架分析音樂、圖片、視頻文件的媒體信息(分辨率、藝術家之類)。
  2. 掃描首先從 prescan 開始,從 MediaProvider 讀取全部文件信息,而後檢查文件是否還存在磁盤中,不存在的文件從數據庫中刪除。
  3. 接着遍歷目錄,當找到一個文件後,會查詢 MediaProvider 數據庫看文件是否存在,不存在的須要插入;已存在的對比文件修改時間與數據庫裏面的值是否一致,不一致的須要更新數據庫。
  4. 再接着根據後綴名區分文件類型,普通文件直接插入數據庫,音視頻及圖片文件須要調用媒體解析器獲取媒體信息。
  5. 而後就能夠把該文件的記錄插入 MediaProvider 數據庫,或者更新已修改文件的數據庫記錄。這樣逐個文件分析,知道遍歷完全部文件。

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

以上簡要介紹了媒體存儲服務掃描流程,須要深刻了解的仍是要看相應代碼。

相關文章
相關標籤/搜索