Android上MediaScanner是如何工作的
2013-07-17 17:09
323 查看
这里注意两个继承关系,在JAVA层有一个MyMediaScannerClient class位于 MediaScanner.java中,如下代码所示
private class MyMediaScannerClient implements MediaScannerClient
在C++层也有一个MyMediaScannerClient class 位于 android_media_MediaScanner.cpp中,如下代码所示
class MyMediaScannerClient : public MediaScannerClient
MediaScannerd的调用过程错综复杂,我们来看一段原代码里面的注释:
/**
* 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() 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.
*
* The MediaScanner class is not thread-safe, so it should only be used in a single threaded manner.
*
* {@hide}
*/
在native层扫描文件的时候,对于类似MP3文件的处理过程中,需要解析MP3文件的 ID3 tags信息。在处理这些ID3信息的时候,可能会遇到一些native charset从而需要 convertValue或者说转码。这个时候,在native层StagefrightMediaScanner 会创建MediaMetadataRetriever实例来首先获得相印的metadata,然后MediaScannerClient会addStringTag,在addStringTag的过程中如果遇到native
charset就需要在MediaScannerClient中进行转码。
最后,MediaScannerClient---》Java Layer MyMediaScanner handleStringTag----》最后在Java layer 把这对转好的 Key/Value pair给存到数据库里面去(通过MediaInserter)
相关文章推荐
- 电池寿命:Android“电池”工具是如何工作的
- 如何将Android的API demo导入到Eclipse工作区中
- 分析一下 Android 异步消息处理机制到底是如何工作的
- iOS 和 Android 的后台推送工作原理各是如何?有什么区别?
- AndroidAnnotations 是如何工作的
- AndroidAnnotations使用说明书—AndroidAnnotations是如何工作的?
- iOS和Android的后台推送工作原理各是如何?
- android 如何调用WPS显示工作文件
- Android四大组件如何协同工作
- Android中R文件的丢失问题以及aapt.exe停止工作如何解决
- Android工作总结之如何做一个优秀的MediaPlayer音频播放器
- AndroidAnnotations——How It Works,AndroidAnnotation是如何工作的
- iOS 和 Android 的后台推送工作原理各是如何?有什么区别?
- Android中R文件的丢失问题以及aapt.exe停止工作如何解决
- android里面,资源文件和资源ID之间的映射是如何工作的?
- AndroidAnnotations说明—AndroidAnnotations它是如何工作的?
- iOS和Android的后台推送工作原理各是如何?
- 【工作感悟】Android 开发者,如何提升自己的职场竞争力?
- android里面,资源文件和资源ID之间的映射是如何工作的?
- 【工作感悟】Android 开发者,如何提升自己的职场竞争力?