Android MediaScanner源代码解析

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);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 06:16:25

Android MediaScanner源代码解析的相关文章

Android DiskLruCache 源代码解析 硬盘缓存的绝佳方案

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47251585: 本文出自:[张鸿洋的博客] 一.概述 依然是整理东西.所以最近的博客涉及的东西可能会比較老一点,会分析一些经典的框架,我觉得可能也是每一个优秀的开发人员必须掌握的东西:那么对于Disk Cache,DiskLruCache能够算佼佼者了,所以我们就来分析下其源代码实现. 对于该库的使用.推荐老郭的blog Android DiskLruCache全然解析,硬盘

Android StageFrightMediaScanner源代码解析

1. 简介 Android中在StageFrightMediaScanner实现对多媒体文件的处理. 此外在StageFrightMediaScanner定义了支持的多媒体文件类型. 文件位置 frameworks\av\media\libstagefright\StagefrightMediaScanner.cpp 编译目标 libstagefright.so 2. processFile processFile并没有做什么处理,主要是调用processFileInternal. 另外可以看到

Android MediaScanner总结

1. 简介 自此Android MediaScanner的源代码分析已经全部写完,前后断断续续写了大半个月的时间,至今刚刚完成.现在对MediaScanner做一下总结.(其实也没啥好总结的,MediaScanner整体架构还是参考Android MediaScanner 总纲 ) 2. 纲领性文章 Android MediaScanner 总纲 此文对MediaScanner架构做了详细描述,包括MediaScanner系统分层,涉及的代码,调用顺序等做了描述,其中几张图可以详细看看. 如果想

Android init源代码分析(2)init.rc解析

本文描述init.rc脚本解析以及执行过程,读完本章后,读者应能 (1) 了解init.rc解析过程 (2) 定制init.rc init.rc介绍 init.rc是一个文本文件,可认为它是Android系统启动脚本.init.rc文件中定义了环境变量配置.系统进程启动,分区挂载,属性配置等诸多内容.init.rc具有特殊的语法.init源码目录下的readme.txt中详细的描述了init启动脚本的语法规则,是试图定制init.rc的开发者的必读资料. Android启动脚本包括一组文件,包括

Android源代码解析之(三)--&amp;gt;异步任务AsyncTask

转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了android中的异步消息机制. 主要解说了Handler对象的使用方式.消息的发送流程等.android的异步消息机制是android中多任务处理的基础,Handler是整个android应用层体系异步消息传递的基础组件,通过对Handler源代码的解析的解析相信大家对android中的异步消息机制有了一个大概的了解.很多其它关于android中的异步消息机制的知识可參考我的:android源代码解析之(二)–>异步消息机制 android

Android 之MediaScanner流程解析

MediaScanner详解 OK, 我们现在开始来大概分析一下android framework中MediaScanner部分的流程,若大家发现分析过程中有错误,欢迎拍砖指正. 分析流程之前,我们先给自己定个要用MediaScanner解决的问题,这样我们才会有目标感,才知道我们要干什么.否则,干巴巴的分析流程,一般都会很容易的迷失在各种code的迷雾中. 我们这里要定的目标是:获取某个MP3文件的artist & album. 我们可以假定,现在有个媒体播放器,在播放music的时候,需要在

Android View体系(八)从源代码解析View的layout和draw流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源代码解析Scroller Android View体系(五)从源代码解析View的事件分发机制 Android View体系(六)从源代码解析Activity的构成 Android View体系(七)从源代码解析View的measure流程 前言 上一篇文章我们讲了View的measure的流程.接

Android源代码解析之(四)--&amp;gt;HandlerThread

转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了AsyncTast的基本使用以及实现原理,我们知道AsyncTask内部是通过线程池和Handler实现的.通过对线程池和handler的封装实现了对异步任务操作.很多其它关于AsyncTask相关的内容,可參考我的android源代码解析之(三)–>异步任务AsyncTask 本文我们将解说HandlerThread相关的概念. HandlerThread是什么东西呢?了解一个类最好的方法就是查看类的定义,所以我们就看一下HandlerTh

Android源代码解析之(六)--&amp;gt;Log日志

转载请标明出处:一片枫叶的专栏 首先说点题外话,对于想学android framework源代码的同学,事实上能够在github中fork一份,详细地址:platform_frameworks_base 这里面基本都是android framework层的源代码了.并且近期发现了一个比較不错的github插件:OctoTree,它 是一个浏览器插件,它能够让你在Github 看代码时,左边栏会出现一个树状结构.就像我们在IDE 一样.当我们看一个项目的结构,或者想看详细的某个文件,这样就会非常方