1. 简介

MediaScanner向上和MediaProvider.MediaScannerService交互, 响应其请求;
向下和JNI交互.
MediaScanner主要工作内容:
(1)接收MediaScannerService的scanDirectoriesscanSingleFile请求
(2)获取各个ContentProvider 环境(Audio,Video,Image,File) initialize
(3)获取需要扫描文件列表,移除已删除文件信息 prescan
(4)通过media_jni(android_media_MediaScanner.cpp)调用底层接口处理扫描
(5)接收media_jni处理结果,在android_media_MediaScanner.cpp中保存一个MyMediaScannerClient用于调用MediaScanner
(6)保存获取的文件信息 postscan
代码位置:
frameworks/base/media/java/android/media/MediaScanner.java

2. scanDirectories

scanDirectories(String[] directories, String volumeName)
扫描文件夹,被MSS调用
MediaScanner处理文件夹的具体流程是:
在MediaScanner中
核心代码如下:

    public void scanDirectories(String[] directories, String volumeName) {            ......            initialize(volumeName);            prescan(null, true);            ......            for (int i = 0; i < directories.length; i++) {                processDirectory(directories[i], mClient);            }            ......            postscan(directories);             ......            releaseResources();        }    }

3. initialize

void initialize(String volumeName)
initialize和releaseResources相对应
功能就是初始化各个ContentProvider (Audio,Video,Image,File)

    private void initialize(String volumeName) {        mMediaProvider = mContext.getContentResolver().acquireProvider("media");        mAudioUri = Audio.Media.getContentUri(volumeName);        mVideoUri = Video.Media.getContentUri(volumeName);        mImagesUri = Images.Media.getContentUri(volumeName);        mThumbsUri = Images.Thumbnails.getContentUri(volumeName);        mFilesUri = Files.getContentUri(volumeName);        mFilesUriNoNotify = mFilesUri.buildUpon().appendQueryParameter("nonotify", "1").build();        if (!volumeName.equals("internal")) {            // we only support playlists on external media            mProcessPlaylists = true;            mProcessGenres = true;            mPlaylistsUri = Playlists.getContentUri(volumeName);            mCaseInsensitivePaths = true;        }    }

4. prescan

void prescan(String filePath, boolean prescanFiles)
获取需要扫描文件列表,移除已删除文件信息

5. postscan

void postscan(String[] directories)
把获取的文件信息写回数据库
其主要工作在
void processPlayLists()

void processPlayList(FileEntry entry, Cursor fileList)
完成

5.1 processPlayLists()

    private void processPlayLists() throws RemoteException {        Iterator<FileEntry> iterator = mPlayLists.iterator();        Cursor fileList = null;        try {            // use the files uri and projection because we need the format column,            // but restrict the query to just audio files            fileList = mMediaProvider.query(mPackageName, mFilesUri, FILES_PRESCAN_PROJECTION,                    "media_type=2", null, null, null);            while (iterator.hasNext()) {                FileEntry entry = iterator.next();                // only process playlist files if they are new or have been modified since the last scan                if (entry.mLastModifiedChanged) {                    processPlayList(entry, fileList);                }            }        }    }

5.2 processPlayList(FileEntry entry, Cursor fileList)
processPlayList(FileEntry entry, Cursor fileList)的工作是把信息写回数据库

6. processDirectory

调用native层

private native void processDirectory(String path, MediaScannerClient client);

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. adb开发工具合集(traceview and dmtracedump)
  6. 使用 android studio 查看 android 源码
  7. Android(安卓)SDK Manager无法更新问题解决办法
  8. android给Button或TextView等设置字体
  9. gradle自动修改android版本号的方法,取java静态变量重命名apk文件

随机推荐

  1. Android App开发总结
  2. 前言
  3. android如何获取手机联系人的数据库
  4. Android权限管理之Permission权限机制及
  5. Android:Android2D绘图
  6. Android使用Application总结
  7. Android 程序的动态调试
  8. Android中AsyncTask基本用法与源码分析(A
  9. Android(安卓)-- 零散记录[短信发送,系统
  10. Android layout_gravity和gravity的区别