android源码解析------Media多媒体framework层分析

1.packages\providers\MediaProvider :含以下 java 文件

          MediaProvider.java
          MediaScannerReceiver.java
          MediaScannerService.java
          MediaThumbRequest.java

2.查看该目录下AndroidMainfest.xml,从MediaScannerService.java 入手。       

     if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            //收到” 启动完毕“广播后,扫描内部存储 /system/media目录扫描手机内存中的媒体文件
           scan(context, MediaProvider.INTERNAL_VOLUME);
      }
      if (action.equals(Intent.ACTION_MEDIA_MOUNTED) &&externalStoragePath.equals(path)) {
              // 收到MOUNT 信息后,扫描外部存储,/mnt/sdcard,sdcard挂载完毕后扫描扩展卡的媒体文件
                   scan(context, MediaProvider.EXTERNAL_VOLUME);
      }
      if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) && path != null && path.startsWith(externalStoragePath + “/”)) {
              // 收到请求启动单个文件的扫描工作,注意这个文件必须位于SD卡上。
                   scanFile(context, path);
      }

    通过scan(…),scanFile(…)函数启动MediaScannerService.

          context.startService(new Intent(context,MediaScannerService.class).putExtras(args));

3.MediaScannerService.java

   onCreate(…)函数开启新的线程。

   onStartCommand(…)函数,每次调用startService时,执行此函数。mServiceHandler发送Message。

   跟中ServiceHandler类,handleMessage(…)根据volume类型,执行scan(directories, volume);函数。

   在scan(String[] directories, String volumeName)函数中, 创建MediaScanner,进行扫描

                MediaScanner scanner = createMediaScanner();

                scanner.scanDirectories(directories, volumeName);

4.媒体扫描工作流程总结:

* MSR 接收外部发来的扫描请求,并通过startService方式启动MSS处理。

* MSS 的主线程接收MSR所收到的请求,然后投递给工作线程去处理。

* 工作线程做一些前期处理工作后(例如向系统广播扫描开始的消息),就创建媒体扫描器mediaScanner来处理扫描目标。

* MS扫描完成后,工作线程再做一些后期处理,然后向系统发送扫描完毕的广播。

二MediaScanner分析。

1.创建MediaScanner

      System.loadLibrary(“media_jni”);//加载libmedia_jni.so

      native_init();//android_media_MediaScanner.cpp

      native_setup();//调用JNI层的函数做一些初始化工作。

2.void scanDirectiories(String[] directories,String volumeName)

    initialize(volumeName); //初始化。

    prescan(null);//扫描前的预处理。

    processDirectory(directories[i],MediaFile.sFileExtensions,mClient);//native函数,对目标文件夹进行扫描

    postscan(directories);//扫描后处理

3.MediaFile.java

   MediaFile.sFileExtensions是一个字符串,包含了当前多媒体系统所支持的媒体文件的后缀名,例如.MP3,.MP4等。

   addFileType(“MP3″,FILE_TYPE_MP3,”audio/mpeg”);

   addFileType(“AMR”,FILE_TYPE_AMR,”audio/amr”);

 4.数据库表

      cd /data/data/com.android.providers.media/database

      external.db表名:album_art/albums/app_package/artists/audio_genres/audio_genres_map/audio_meta/audio_playlists/

                                      audio_playlists_map/audio_ringtone/images/music_audio_playlists/music_audio_playlists_map/

                                      music_quick_list/thumbnails/video/videocall_images/videothumbnails

  5.MediaProvider.java

     创建数据库表:   

private static final String[] EXTERNAL_DATABASE_TABLES = new String[] {
        "images",
        "thumbnails",
        "audio_meta",
        "artists",
        "albums",
        "audio_genres",
        "audio_genres_map",
        "audio_playlists",
        "audio_playlists_map",
        "video",
    };

 

(未完待续…)

    原文作者:Android源码分析
    原文地址: https://blog.csdn.net/dany1202/article/details/7035560
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞