Android 多媒体扫描过程(Android Media Scanner Process) 下面是系统图 MediaScannerReceiver 会在任何的 ACTION_BOOT_COMPLETED, ACTION_MEDIA_MOUNTED 或 ACTION_MEDIA_SCANNER_SCAN_FILE 意图( intent )发出的时候启动
因为解析媒体文件 的元数据 或许会需要很长时间 ,所以 MediaScannerReceiver 会启动 MediaScannerService
MediaScannerService 调用一个公用类 MediaScanner 去处理真正的工作
MediaScannerReceiver 维持两种扫描目录:一种是内部卷( internal volume )指向 $(ANDROID_ROOT)/media
另一种是外部卷( external volume )指向 $(EXTERNAL_STORAGE)
扫描和解析工作位于 JAVA 层和 C++ 层
JAVA 层是启动器
MediaScanner 扫描所有目录,如下步骤: 1
JAVA 层初始化 在这一步骤中,它会根据目录是在内部卷还是外部卷打开不同的数据库
Java 层预扫描 首先清除文件和播放 列表的缓存条目
然后根据 MediaProvider 返回的请求结果生成新文件和播放列表缓存条目
C++ 层处理目录 列举出所有文件和特定的所有子目录(如果子目录包含一个
nomedia 隐藏文件,则不会被列举出来
被列举的文件是根据文件扩展来判断文件是否被支持
如果支持这种文件扩展, C++ 层就会回调到 JAVA 层扫描文件
这种扩展就会被扫描到 MediaFile
java 中列出
下面是支持的文件扩展列表
/* Audio */ addFil