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", };

(未完待续...)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值