mediascanner流程


在MediaScanner.java文件的MediaScanner类前面有如下对扫描过程的说明。原文和翻译如下:

1.原文

Internal service helper that no-one should use directly.

The way the scan currently works is:
- The Java MediaScannerService creates a MediaScanner (this class), and calls
  MediaScanner.scanDirectories on it.
- scanDirectories() calls the native processDirectory() for each of the specified directories.
- the processDirectory() JNI method wraps the provided mediascanner client in a native
  ‘MyMediaScannerClient‘ class, then calls processDirectory() on the native MediaScanner
  object (which got created when the Java MediaScanner was created).
- native MediaScanner.processDirectory() (currently part of opencore) calls
  doProcessDirectory(), which recurses over the folder, and calls
  native MyMediaScannerClient.scanFile() for every file whose extension matches.
- native MyMediaScannerClient.scanFile() calls back on Java MediaScannerClient.scanFile,
  which calls doScanFile, which after some setup calls back down to native code, calling
  MediaScanner.processFile().
- MediaScanner.processFile() calls one of several methods, depending on the type of the
  file: parseMP3, parseMP4, parseMidi, parseOgg or parseWMA.
- each of these methods gets metadata key/value pairs from the file, and repeatedly
  calls native MyMediaScannerClient.handleStringTag, which calls back up to its Java
  counterparts in this file.
- Java handleStringTag() gathers the key/value pairs that it‘s interested in.
- once processFile returns and we‘re back in Java code in doScanFile(), it calls
  Java MyMediaScannerClient.endFile(), which takes all the data that‘s been
  gathered and inserts an entry in to the database.

In summary:
Java MediaScannerService calls
Java MediaScanner scanDirectories, which calls
Java MediaScanner processDirectory (native method), which calls
native MediaScanner processDirectory, which calls
native MyMediaScannerClient scanFile, which calls
Java MyMediaScannerClient scanFile, which calls
Java MediaScannerClient doScanFile, which calls
Java MediaScanner processFile (native method), which calls
native MediaScanner processFile, which calls
native parseMP3, parseMP4, parseMidi, parseOgg or parseWMA, which calls
native MyMediaScanner handleStringTag, which calls
Java MyMediaScanner handleStringTag.
Once MediaScanner processFile returns, an entry is inserted in to the database.

2.译文

不能直接使用内部服务助手。

目前扫描的工作方法是:
- Java类MediaScannerService创建了MediaScanner对象,并且调用此对象的MediaScanner.scanDirectories方法。

- scanDirectories()方法为每一个指定的目录调用native方法processDirectory()。

- processDirectory() JNI方法通过native类MyMediaScannerClient,提供了一个mediascanner 客户端,

然后通过此native MediaScanner对象调用processDirectory()方法(当创建Java对象MediaScanner时创建的)。

- native方法MediaScanner.processDirectory() (目前是opencore的一部分)调用doProcessDirectory()方法递归处理文件夹,

并且为每一个扩展名匹配的文件调用native方法MyMediaScannerClient.scanFile()。

- Java方法MediaScannerClient.scanFile回调native方法MyMediaScannerClient.scanFile()(MyMediaScannerClient类实现了MediaScannerClient接口),
  MyMediaScannerClient.scanFile()方法又调用了doScanFile方法,doScanFile方法做了一些设置后又调用native方法MediaScanner.processFile()。

- MediaScanner.processFile()依据文件类型调用以下方法中的一个: parseMP3, parseMP4, parseMidi, parseOgg或者parseWMA。

-这些方法从文件中取得metadata键/值对,并且循环调用native方法MyMediaScannerClient.handleStringTag,由文件中的java counterparts决定回调。

- Java方法handleStringTag()收集感兴趣的键/值对。
- 在doScanFile()方法中,一旦processFile方法返回Java代码,它调用Java方法MyMediaScannerClient.endFile(),并且把所有收集到的数据插入到数据库实体中。

总结:

Java类MediaScannerService调用
Java类MediaScanner的scanDirectories方法,它又调用了
Java类MediaScanner的processDirectory 方法(native方法),它又调用了
native类MediaScanner的processDirectory方法,它又调用了
native类MyMediaScannerClient的scanFile方法,它又调用了  (此处不 容易理解,从native调用java层的方法)
Java类MyMediaScannerClient的scanFile方法,它又调用了
Java接口MediaScannerClient的doScanFile方法(实际是调用的java类MyMediaScannerClient的doScanFile方法,java接口MediaScannerClient未定义doScanFile方法),它又调用了
Java类MediaScanner的processFile方法(native方法),它又调用了
native类MediaScanner的processFile方法,它又调用了
native方法parseMP3, parseMP4, parseMidi, parseOgg或者parseWMA,它又调用了
native类MyMediaScanner的handleStringTag方法,它又调用了
Java类MyMediaScanner的handleStringTag方法。
一旦从MediaScanner的processFile方法返回,将检索到的一条媒体条目信息插入到数据库中。

Java类MyMediaScannerClient的定义在MediaScanner.java文件中,实现了MediaScannerClient接口。

Native类MyMediaScannerClient的定义在android_media_MediaScanner.cpp文件中,继承了MediaScannerClient类。

调用时序图如下:引自http://www.cnblogs.com/halzhang/archive/2011/03/10/1980319.html

 
时间: 2024-08-27 11:20:17

mediascanner流程的相关文章

Android 之MediaScanner流程解析

MediaScanner详解 OK, 我们现在开始来大概分析一下android framework中MediaScanner部分的流程,若大家发现分析过程中有错误,欢迎拍砖指正. 分析流程之前,我们先给自己定个要用MediaScanner解决的问题,这样我们才会有目标感,才知道我们要干什么.否则,干巴巴的分析流程,一般都会很容易的迷失在各种code的迷雾中. 我们这里要定的目标是:获取某个MP3文件的artist & album. 我们可以假定,现在有个媒体播放器,在播放music的时候,需要在

Android MediaScanner源代码解析

1. 简介 MediaScanner向上和MediaProvider.MediaScannerService交互, 响应其请求; 向下和JNI交互. MediaScanner主要工作内容: (1)接收MediaScannerService的scanDirectories和scanSingleFile请求 (2)获取各个ContentProvider 环境(Audio,Video,Image,File) initialize (3)获取需要扫描文件列表,移除已删除文件信息 prescan (4)通

转自:Android MediaScanner 详尽分析

转自http://blog.csdn.net/Innost/article/details/6083467 一 MediaScannerService 多媒体扫描是从MediaScannerService开始的.这是一个单独的package.位于 packages/providers/MediaProvider:含以下Java文件 l         MediaProvider.java l         MediaScannerReceiver.java l         MediaSca

[深入理解Android卷一全文-第十章]深入理解MediaScanner

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在OSC博客中全文转发这两本书的全部内容. 第10章 深入理解MediaScanner 本章主要内容 ·  介绍多媒体系统中媒体文件扫描的工作原理. 本章涉及的源代码文件名及位置 下面是本章分析的源码文件名及其位置. ·  MediaProvider.java packages/providers/MediaProvider/MediaProvider.

MediaScanner与音乐信息扫描==

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=98713 ========================================================== Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中.程序可以直接从MediaStore中读取相应的媒体信息.通过注册监听MediaScanner广播的Inte

#24 centos6(RHEL)系列操作系统的启动流程、与命令chkconfig、grub的使用

所有由rc脚本关闭或启动的链接文件的原文件都存在于/etc/rc.d/init.d,系统为了方便使用,为此目录创建了链接/etc/init.d 所有/etc/inid.d(/etc/rc.d/init.d)目录中的脚本执行方式: # /etc/init.d/srv_script {start|stop|restart|status} # service srv_script {start|stop|restart|status} chkconfig命令: chkconfig - updates

游戏测试经历的流程及发版本注意的问题(或许有遗漏)

一.测试流程: 1.测试人员需要参与需求会议,了解需求,如有必要,提出疑问点,产品修改正 2.需求确定后,编辑测试用例或者测试功能点 3.开发提交完毕后,执行测试用例(要求开发出电脑版,节约前期打包,安装包的时间) 4.发现bug,提交bug到禅道,并通知相关人员 5.开发组修正bug,禅道指派给测试人员,表明已修复 6.对已修正的bug,进行回归测试 7.修正完毕的bug在禅道上置为关闭 8.待电脑版功能验证完毕后,进行手机包测试 9.整体测试完毕,可以发布包 补充: 1.中途有修改需求,也需

汇编语言入门:流程控制

流程控制:顺序,分支,循环 程序计数器PC中存储当前执行的程序在EM中的位置 汇编里面,用比较.跳转实现流程控制. 1.顺序:PC+1(不一定加一,看指令长度) 2.分支循环,直接赋给PC值,执行指定地址的程序 有时候需要程序有一定的流程控制能力,它不是老老实实按照顺序来执行的,中间可能会跳过一些代码 修改PC值,不可用MOV指令,PC是特殊的寄存器,特殊对待,跳转指令修改其值. 跳转指令: 1 ja 大于时跳转 2 jae 大于等于 3 jb 小于 4 jbe 小于等于 5 je 相等 6 j

1.2软件生命周期&amp;测试流程

软件的生命周期 可行性分析-需求分析-软件设计-软件编码-软件测试-软件维护 1.可行性分析 主要确定软件开发的目的和可行性(PM) 2.需求分析 对软件的功能进行详细的分析(PM),输出需求规格说明书(原型图) 3.软件设计(DEV) 把需求分析得到的结果转换为软件结构和数据结构,形成系统架构 概要设计:搭建架构.模块功能.接口连接和数据传输 详细设计:模块深入分析,对各模块组合进行分析,伪代码   包含数据库设计说明 4.软件编码(DEV) 可运行的程序代码 5.软件测试 5.1.单元测试(