Android上MediaScanner是如何工作的_第1张图片

这里注意两个继承关系,在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. Android应用程序组件Content Provider的启动过程源代码分析(2)
  2. android开发之res下的menu (xml+代码的形式)
  3. 【源代码】一键分享各个社交平台_android
  4. Android常用框架混淆代码
  5. Android签名文件生成
  6. android获取指定路径下目录文件
  7. Android之GLES2.0显示图片测试代码

随机推荐

  1. Android相关网络资源整理
  2. android 连接CMWAP
  3. android之弹出气泡PopupWindow
  4. android 关于再按一次退出程序效果
  5. MediaScannerReceiver
  6. android proguard 错误处理
  7. Android: Launch the HOME screen
  8. Android(安卓)超级水平仪 金属红色仪表风
  9. Android(安卓)获取View宽高
  10. js判断移动端系统