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", };
(未完待续...)