这里注意两个继承关系,在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)








更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. EditText实时判断输入字符数
  4. Android控件笔记——在界面中显示图片
  5. Android中创建与几种解析xml的方法!
  6. android按钮按下的效果
  7. android文件关联之mime type
  8. Android(安卓)studio 使用AIDL 无法import class问题解决
  9. android中调用金山词霸

随机推荐

  1. Android设置ProgressBar的前景和背景及其
  2. ANDROID 探究oom内幕
  3. Android应用程序的开机自启动
  4. Android(安卓)截屏并保存
  5. Android应用程序访问linux驱动第一步:实现
  6. Android状态栏微技巧,动态控制状态栏显示
  7. Android防止内存泄露
  8. Android简易计算器----布局_菜单_提示框
  9. Android(安卓)ndk探索之一(利用Android(安
  10. [Android]继承式UI界面布局设计