深入Android媒体存储服务(二):磁盘扫描流程
简介:
本文是《深入Android媒体存储服务》系列第二篇,简要介绍媒体存储服务扫描文件的流程。文中介绍的是 Android 4.2。
Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用。因此如何保持数据库和磁盘文件保持一致非常关键,这个就是媒体存储服务中 MediaScanner 的工作。
媒体文件扫描流程
整个流程如下图所示,
监听 Intent 事件
MediaProvider(源码位于 packages/providers/MediaProvider)里面的 MediaScannerReceiver 类会监听 Intent 事件,有以下 Intent 时会开始扫描磁盘文件的操作:
Intent | 动作 |
---|---|
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE | APP 发出的,扫描单个指定文件 |
Intent.ACTION_MEDIA_MOUNTED | 系统发出的磁盘挂载完成通知,或者是 APP 发出,会执行全磁盘扫描 |
Intent.ACTION_BOOT_COMPLETED | 系统发出的开机启动完成通知,会执行全磁盘扫描,也会扫描 /system/media 目录的媒体文件。 |
Note: 手机 /system/media 目录下有一些内置媒体文件,例如说系统内置铃声。这个目录只有开机会扫描一次。
开始文件扫描
- 以全磁盘扫描为例,接着 MediaProvider 里面的 MediaScannerService 服务启动,开始调用 MediaScanner(frameworks/base/media/java/android/media/MediaScanner.java) 扫描磁盘。MediaScanner 控制整个扫描流程,会通过 JNI 调用相应 C++ 代码遍历整个磁盘的目录树,并调用 libstagefright 多媒体框架分析音乐、图片、视频文件的媒体信息(分辨率、艺术家之类)。
- 扫描首先从 prescan 开始,从 MediaProvider 读取所有文件信息,然后检查文件是否还存在磁盘中,不存在的文件从数据库中删除。
- 接着遍历目录,当找到一个文件后,会查询 MediaProvider 数据库看文件是否存在,不存在的需要插入;已存在的对比文件修改时间与数据库里面的值是否一致,不一致的需要更新数据库。
- 再接着根据后缀名区分文件类型,普通文件直接插入数据库,音视频及图片文件需要调用媒体解析器获取媒体信息。
- 然后就可以把该文件的记录插入 MediaProvider 数据库,或者更新已修改文件的数据库记录。这样逐个文件分析,知道遍历完所有文件。
Note: 数据库操作比较费 IO 资源,所以数据库插入、更新、删除操作其实都是批量处理的,操作先进入一个队列,数目达到一定程度才会真正进行数据库操作。
缩略图与专辑封面
APP 通过以下接口查询视频图片缩略图与音乐专辑封面:
// 查询视频和图片缩略图
MediaStore.Video.Thumbnails.getThumbnail(cr, id, MINI_KIND); // 查询音乐专辑封面
ContentResolver().openFileDescriptor(uri, "r");
第一次取的时候会解析文件取得缩略图或专辑封面,然后缩略图会被缓存到磁盘,数据库也会记录。下次再取时,就会直接返回缓存过的图片,不用去解析文件。
以上简要介绍了媒体存储服务扫描流程,需要深入了解的还是要看相应代码。
转载请注明出处:http://www.cnblogs.com/imouto/p/media-file-scanning-process.html
本文外部镜像:http://oteku.blogspot.com/2013/10/media-file-scanning-process.html
深入Android媒体存储服务(二):磁盘扫描流程的更多相关文章
- Android 媒体存储服务(二)
Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...
- Android 媒体存储服务(一)
Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...
- 专题合集:深入Android媒体存储服务
Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.这里包含了数据库管理. ...
- 深入Android媒体存储服务(一):APP与媒体存储服务的交互
简介: 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文 ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- Android数据存储(二)----PreferenceFragment详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android学习--探究服务(二)
服务的基本用法 定义服务: 我们需要先创建服务,我们要使用就的利用一个类去继承它,然后重写它的几个方法,具体的我们看下面的代码: 我们重写了下面三个方法: * onCreate() ...
- 阿里云OSS对象存储服务(二)
一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
随机推荐
- Eclipse用link方式安装插件
其实eclipse安装插件更方便的方法就是直接扔到eclipse目录下的dropins文件夹,但如果插件比较多或者大的话,会让eclipse变得臃肿.下面介绍的用link方式可以避免这样的问题. 用l ...
- Ubuntu 使用wget 命令下载JDK
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-co ...
- js数组(一)
一.创建数组两种方法: 1Array构造 var colors = new Array();2.字面量表示什么事字面量,如 var colors = ["red","gr ...
- Linux06--Shell程序设计02 数据流重定向与管道
包含3种数据流: •标准输入(stdin):代码为0,符号为<或<<; •标准输出(stdout):代码为1,符号为>或>>; •标准错误输出(stderr):代码 ...
- 修改Windows XP的桌面路径
WinowsXP 的桌面的是在系统盘上,一但系统瘫痪需要重新安装系统时,总得记得去备份桌面的重要文件,如果一不小心忘记备份就重装系统的话,那些重要文件就一去不复返了.其实我们可以把桌面放到其它盘目录里 ...
- WPF(MultiTrigger)
原文 http://blog.csdn.net/haifengzhilian/article/details/8822098 <Window x:Class="TestResource ...
- perl 一个简单的面向对象的例子
<pre name="code" class="python">[root@wx03 wx]# cat x1.pm package x1; use ...
- VC维的物理意义
vc约等于可调节参数的个数 来自为知笔记(Wiz)
- 编程内功修炼之数据结构—BTree(二)实现BTree插入、查询、删除操作
1 package edu.algorithms.btree; import java.util.ArrayList; import java.util.List; /** * BTree类 * * ...
- Struts2 一、 视图转发跳转
<struts> <constant name="struts.118n.encoding" value="UTF-8"></co ...