【转:】http://www.eoeandroid.com/thread-5143-1-1.html
下面是系统图
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层初始化
在这一步骤中,它会根据目录是在内部卷还是外部卷打开不同的数据库。
2.Java层预扫描
首先清除文件和播放列表的缓存条目。然后根据MediaProvider返回的请求结果生成新文件和播放列表缓存条目。
3.C++层处理目录
列举出所有文件和特定的所有子目录(如果子目录包含一个.nomedia隐藏文件,则不会被列举出来。)。被列举的文件是根据文件扩展来判断文件是否被支持。如果支持这种文件扩展,C++层就会回调到JAVA层扫描文件。这种扩展就会被扫描到MediaFile.java中列出。下面是支持的文件扩展列表。
/* Audio */
addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg");
addFileType("M4A", FILE_TYPE_M4A, "audio/mp4");
addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav");
addFileType("AMR", FILE_TYPE_AMR, "audio/amr");
addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb");
addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma");
addFileType("OGG", FILE_TYPE_OGG, "application/ogg");
addFileType("MID", FILE_TYPE_MID, "audio/midi");
addFileType("XMF", FILE_TYPE_MID, "audio/midi");
addFileType("RTTTL", FILE_TYPE_MID, "audio/midi");
addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi");
addFileType("IMY", FILE_TYPE_IMY, "audio/imelody");
/* Video */
addFileType("MP4", FILE_TYPE_MP4, "video/mp4");
addFileType("M4V", FILE_TYPE_M4V, "video/mp4");
addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp");
addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp");
addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2");
addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2");
addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv");
/* Image */
addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg");
addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg");
addFileType("GIF", FILE_TYPE_GIF, "image/gif");
addFileType("PNG", FILE_TYPE_PNG, "image/png");
addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp");
addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp");
/* Audio Play List */
addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl");
addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls");
addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl");
4.Java层扫描文件
a)Java层开始文件
首先它忽略一些MacOS 和 Windows Media Player特殊的文件。然后它会查看被扫描的文件是否已经存在于缓存条目中,如果存在,它会检查文件上次修改的时间是否改变。最后它返回该文件是否需要进一步处理的结果。如果不需要,接下来的两步不会执行。
b)C++层扫描文件
不是所有的文件都需要交给C++层解析成元数据。只有下面的文件类型会被解析,注意,这里不处理image文件。
if (mFileType == MediaFile.FILE_TYPE_MP3 ||
mFileType == MediaFile.FILE_TYPE_MP4 ||
mFileType == MediaFile.FILE_TYPE_M4A ||
mFileType == MediaFile.FILE_TYPE_3GPP ||
mFileType == MediaFile.FILE_TYPE_3GPP2 ||
mFileType == MediaFile.FILE_TYPE_OGG ||
mFileType == MediaFile.FILE_TYPE_MID ||
mFileType == MediaFile.FILE_TYPE_WMA) {
……
}
复制代码
对于被解析的元数据信息,C++层会回调到JAVA层的handleStringTag。Java层会记录它的name/value信息。
c)Java层结束文件
最后根据上一步解析出的值, Java层会更新相应的MeidaProvider产生的数据库表。
5.Java层发送扫描
到目前为止,所有文件已经被扫描,它最后会检查文件和播放列表缓存条目,看是否所有项仍然存在于文件系统。如果有空条目,则会从数据库中删除。这样它能够保持数据库和文件系统的一致性。
其他的应用程序通过接收MediaScannerService发出的ACTION_MEDIA_SCANNER_STARTED 和ACTION_MEDIA_SCANNER_FINISHED意图能够知道什么时候扫描操作开始和结束
- 大小: 31.4 KB
分享到:
相关推荐
Android Media Scanner Process
根据ZXing 3.1.0 源码编译,未做任何发动。
端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid
'android.intent.action.MEDIA_SCANNER_FINISHED' 开始扫描介质的一个目录。 'android.intent.action.MEDIA_SCANNER_STARTED' 扩展介质的挂载被解除 (unmount)。 因为它已经作为 USB 大容量存储被共享。 'android....
驱动程序-扫描仪驱动-明基benq scanner 5000s扫描仪驱动.zip
虚拟扫描仪Virtual Twain Scanner;虚拟扫描仪Virtual Twain Scanner 32/64位
Android 多媒体扫描过程详细介绍,MediaScannerReceiver 会在任何的 ACTION_BOOT_COMPLETED, ACTION_MEDIA_MOUNTED 或 ACTION_MEDIA_SCANNER_SCAN_FILE 意图( intent )发出的时候启动。因为解析媒体文件 的元数据 ...
1.更新多媒体数据库,类似Media Scanner 2.通过MediaStore 获取多媒体的meta 数据。
TCP Port Scanner (connect() scan) NIC vendor database Export results to your sdcard in XML Fast access to Wifi Settings Adaptive scanning rate (slow start, then adaptive to network latency) Open ...
Scanner Compat库解决了在Android上扫描Bluetooth Low Energy设备的问题。 最初在Android 4.3中创建的扫描仪API在Android 5.0中已更改,并在6.0和8.0中进行了扩展。 该库甚至可以在较旧的手机上使用现代API,模拟不...
Android-Scanner-Compat-Library, 在Android上,用于蓝牙智能扫描的兼容 多功能扫描仪兼容程序库 扫描仪兼容的库通过在Android上扫描蓝牙智能设备解决了这个问题。 scanner在 Android 5.0中已经改变,并在 6.0中扩展...
Android Scanner扫描目标设备可用端口的小程序.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
目标电脑端口扫描工具——Advanced port scanner,即时打开即时关闭,绿色无毒,可以对目标IP地址或地址段进行扫描
Barcode Scanner 条码扫描工具就像其名字那样说的,可以扫描各种出版物的一维码和二维码,通过该工具可以直接读取条码中存储的信息,或是数字、或是网址。 功能简介: * 扫描一维条形码和二维QR码。识别后可以用...
主要为大家详细介绍了基于barcodescanner实现Android二维码扫描功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
扫描工具Web_Scanner
BarcodeScanner安卓二维码扫描源码
佳能扫描仪驱动Canon_Scanner_lide100,佳能扫描仪的驱动程序
Advanced IP Scanner是一款用于Windows 的快速、健壮和易于使用的局域网扫描器。它很容易让您在几秒钟之内得到局域网计算机的相关信息。它使您能够单击访问更多有用的功能- 远程关机和唤醒,RAdmin集成,等等。本...
scanner扫描图片源码参考 scanner扫描图片源码参考scanner扫描图片源码参考scanner扫描图片源码参考