简介: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
以上简要介绍了媒体存储服务扫描流程,须要深刻了解的仍是要看相应代码。