Android 媒体存储服务

简介

本文是《深入Android媒体存储服务》系列第二篇,简要介绍媒体存储服务扫描文件的流程。文中介绍的是 Android 4.2。

Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用。因此如何保持数据库和磁盘文件保持一致非常关键,这个就是媒体存储服务中 MediaScanner 的工作。

整个流程如下图所示,

监听 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 目录的媒体文件。

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">删除操作其实都是批量处理的,操作先进入一个队列,数目达到一定程度才会真正进行数据库操作。

APP 通过以下接口查询视频图片缩略图与音乐专辑封面:

1 // 查询视频和图片缩略图
2 MediaStore.Video.Thumbnails.getThumbnail(cr, id, MINI_KIND);
3
4 // 查询音乐专辑封面
5 ContentResolver().openFileDescriptor(uri, "r");

第一次取的时候会解析文件取得缩略图或专辑封面,然后缩略图会被缓存到磁盘,数据库也会记录。下次再取时,就会直接返回缓存过的图片,不用去解析文件。

以上简要介绍了媒体存储服务扫描流程,需要深入了解的还是要看相应代码。

Android 媒体存储服务(二)的更多相关文章

  1. 深入Android媒体存储服务(二):磁盘扫描流程

    简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套媒体存储服务,进程名是 and ...

  2. Android 媒体存储服务(一)

    Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...

  3. 专题合集:深入Android媒体存储服务

    Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.这里包含了数据库管理. ...

  4. 深入Android媒体存储服务(一):APP与媒体存储服务的交互

    简介: 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文 ...

  5. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  6. Android数据存储(二)----PreferenceFragment详解

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. Android学习--探究服务(二)

    服务的基本用法 定义服务: 我们需要先创建服务,我们要使用就的利用一个类去继承它,然后重写它的几个方法,具体的我们看下面的代码: 我们重写了下面三个方法: * onCreate()           ...

  8. 阿里云OSS对象存储服务(二)

    一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...

  9. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

随机推荐

  1. Linux下搭建DNS服务器

    1. 安装需要的软件 由于实验过程是在自己电脑进行的,所以需要安装bind bind-chroot,以下为安装过程. 图1-1 安装bind 图1-2 安装bind-chroot 2.修改DNS主配置 ...

  2. Eclipse 离线安装ADT

    由于小猪的Eclipse中ADT版本过低无法打开Android项目了,所以要更新ADT(Android Develop Tools),但是在国内由于谷歌与本国微妙的关系想自动安装总是卡在某个点上. 所 ...

  3. react参考项目001

    https://github.com/chen2009277025/webpack-ant-design-demo https://github.com/cobish/cobish.github.io ...

  4. 实验一 DOS命令解释程序的编写

    一.目的和要求 1. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法: (4)掌握C语言编程初步. 2.实验要求 编写类似于DOS,UNIX的命令行解释程 ...

  5. 国内技术管理人员批阅google的“春运交通图”项目(大公司下的高效率)<转载>

    在整理一份报告的时候,偶然看到2008年春节期间google推出的“春运交通图”项目建设历程报道,很受启发,随以国内的技术管理人员眼光批阅了这篇文章,同时也是自嘲吧. 以下黑色字体是原报道,红色字体是 ...

  6. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

  7. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

  8. 用JQuery Validate框架,在IE8下验证报错问题解决

    网站后台用了JQuery Validate框架,版本是jQuery Validation Plugin 1.8.1 因为用的时间比较久了,一直没有更新新版本. 最近公司信息录入员有调整,没有IE11浏 ...

  9. Linux学习 : 自己写bootloader

    一.bootloader 目标:启动内核 基本功能: ①初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH ②image比较大需要重定位到SDRAM ②将内核从NAND FLA ...

  10. 利用Volley封装好的图片缓存处理加载图片

    Volley 工具箱中提供了一种通过 DiskBasedCache 类实现的标准缓存.这个类能够缓存文件到磁盘的指定目录.但是为了使用 ImageLoader,我们应该提供一个自定义的内存 LRC b ...