1. MediaScanner HEAD

2. 应用层 MediaProvider

packages\providers\MediaProvider

(1) MediaProvider

packages\providers\MediaProvider\MediaProvider.java

MediaProvider继承于ContentProvider,主要用于创建媒体库的数据库表.

具体内容请查阅怎样创建Provider.

MediaProvider中包涵一个BroadcastReceiver,用于监听SDCard挂载/卸载

(2) MediaReceiver

监听扫描事件, 调用MSS

Action :

Intent.ACTION_BOOT_COMPLETED, Intent.ACTION_MEDIA_MOUNTED

scan volume MediaScannerService

else

scanFile filepath MediaScannerService

(3) MediaScannerService MSS

onStartCommand==>ServiceHandler==>scanFile

当我们调用startService的时候。假设相应的Service还未创建就会调用onCreate方 法===方法。

每次startService的时候就调用onStartCommand,所以ServiceHandler就在此发送消息了。

call: MediaScanner :: scanSingleFile, scanDirectories

3. JAVA 层

Call Stack : Google注解

/*
* 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.
*/



(1) MediaScanner

frameworks/base/media/java/android/media/MediaScanner.java

Call JNI

    static {
System.loadLibrary("media_jni");
native_init();
}

scanDirectories ⇒ jni processDirectory

scanSingleFile ==> MyMediaScannerClient.doScanFile

deal with image, audio, video ⇒ jni processFile

4. JNI层

(1) android_media_MediaScanner.cpp

frameworks\base\media\jni\android_media_MediaScanner.cpp

MediaScanner *mp = getNativeScanner_l(env, thiz);

mp->processDirectory(pathStr, myClient);

mp->processFile(pathStr, mimeTypeStr, myClient);

android_media_MediaScanner中比較重要的是MyMediaScannerClient类, 该类会被继续传究竟层,用于调用java层(MediaScanner.java)的 scanFile, handleStringTag, setMimeType

5. Server Proxyer

libmedia – libmedia.so

frameworks\av\media\libmedia\MediaScanner.cpp

处理具体的文件

假设是目录须要返回JAVA层中,採用scanFile处理

6. Server

frameworks\av\media\libstagefright\StagefrightMediaScanner.cpp

libstagefright.so

依据文件后缀推断可处理的文件

然后通过MediaMetadataRetriever获取视频的具体信息,

最后同过handleString一步一步向上传, 在MediaScannerService中把信息写入数据库.

Android MediaScanner 总纲的更多相关文章

  1. Android MediaScanner:(一)MediaScanner总体架构

    Android MediaScanner:(一)MediaScanner总体架构 分类: Android android.multimedia2012-05-19 18:29 5050人阅读 评论(5 ...

  2. Android MediaScanner 详尽分析

    [Innost]: http://blog.csdn.net/Innost/article/details/6083467 ====================================== ...

  3. Android MediaScanner

    一.MediaScanner 的使用 1)Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件 public void scanFileAsync(Context ...

  4. Android MediaScanner使用简单介绍

    1. 运行扫描 仅仅有系统开机的时候才会运行MediaScanner,其他情景下须要手动运行扫描(拍摄,下载等). 手动运行扫描的方法是发送MediaScanner广播: 1.1 扫描指定文件: In ...

  5. Android MediaScannerJNI源代码具体解释

    1.简单介绍 MediaScannerJNI的在MediaScanner中的地位可參考 Android MediaScanner 总纲 MediaScanner JNI文件名称: android_me ...

  6. Android媒体扫描详细解析之一(MediaScanner & MediaProvider)

    用过Android手机的同学都知道,每次开机的时候系统会先扫描sdcard,sdcard重新插拔(挂载)也会扫描一次sdcard. 为什么要扫描sdcard,其实是为了给系统的其他应用提供便利,比如, ...

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

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断.所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  8. <Android Framework 之路>Android5.1 MediaScanner

    前言 MediaScanner是Android系统中针对媒体文件的扫描过程,将储存空间中的媒体文件通过扫描的方式遍历并存储在数据库中,然后通过MediaProvider提供接口使用,在Android多 ...

  9. 深入理解Android(5)——从MediaScanner分析Android中的JNI

    前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...

随机推荐

  1. Oracle 12C -- 设置CDB启动后,PDBs自动启动

    CDB重启后,PDBs默认是处于mounted状态 SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ---------------- ...

  2. 收缩sqlserver事务日志

    若要允许 DBCC SHRINKFILE 命令收缩文件,首先需要通过将数据库恢复模式设置为 SIMPLE 来截断该文件. 示例,收缩数据库abce的事务日志 USE abce; GO -- Trunc ...

  3. AndroidStudio编译错误:Error: null value in entry: blameLogFolder=null

    今天写项目的时候,电脑开了个WiFi热点,然后这个热点和window驱动不兼容,有时候会导致电脑重启,重启之后AndroidStudio编译就报错了, Error: null value in ent ...

  4. Inside i++

    i++.++i.i=i+1.效率怎么样?看过一本书上说,i++比i=i+1好的地方是因为i=i+1中的那个1要占用一个寄存器,所以速度没有i++快,于是我想验证一下.另外,以前听说过Java中的“i= ...

  5. cocos2d 2.0和UIKit混合编程, Push CCDirector的时候出现黑屏的天坑

    症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...

  6. 坑爹的高德地图API

    症状 ld: '-[MASearch poiSearchWithOption:]' in *****/Release-iphonesimulator/libMASearchKit.a(MASearch ...

  7. Mac 升级后idea执行git命令报错xcrun: error: invalid active developer path的解决办法

    报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...

  8. 使用 vue-cli 实现组件之间数据交换

    1 使用脚手架工具用 webpack 模板初始化项目,用 webstorm 打开项目.src 目录下是要编写的源文件. main.js 文件 是主入口文件, 在es6语法中,:function(){} ...

  9. mysql性能测试(索引)

    首先,使用Talend随机生成一千万条数据: 数据库表中现在有1千万+的数据: mysql> select count(*) from zhangchao; +----------+ | cou ...

  10. Windows 计划任务 Task Schedule 怎么 运行 .bat文件

    1. 新建 test.bat 需要切换文件夹以后 并且执行程序. cd /D "F:\xxxfolder" && dotnet testdll.dll 2. 直接设 ...