`

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层初始化 


    在这一步骤中,它会根据目录是在内部卷还是外部卷打开不同的数据库。 


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文件。 

Java代码 
  1. if (mFileType == MediaFile.FILE_TYPE_MP3 ||   
  2. mFileType == MediaFile.FILE_TYPE_MP4 ||   
  3. mFileType == MediaFile.FILE_TYPE_M4A ||   
  4. mFileType == MediaFile.FILE_TYPE_3GPP ||   
  5. mFileType == MediaFile.FILE_TYPE_3GPP2 ||   
  6. mFileType == MediaFile.FILE_TYPE_OGG ||   
  7. mFileType == MediaFile.FILE_TYPE_MID ||   
  8. mFileType == MediaFile.FILE_TYPE_WMA) {   
  9.   
  10.   
  11. ……   
  12.   
  13.   
  14.   
  15. }  


复制代码 

对于被解析的元数据信息,C++层会回调到JAVA层的handleStringTag。Java层会记录它的name/value信息。 


    c)Java层结束文件 


   最后根据上一步解析出的值, Java层会更新相应的MeidaProvider产生的数据库表。 


5.Java层发送扫描 


    到目前为止,所有文件已经被扫描,它最后会检查文件和播放列表缓存条目,看是否所有项仍然存在于文件系统。如果有空条目,则会从数据库中删除。这样它能够保持数据库和文件系统的一致性。 


    其他的应用程序通过接收MediaScannerService发出的ACTION_MEDIA_SCANNER_STARTED 和ACTION_MEDIA_SCANNER_FINISHED意图能够知道什么时候扫描操作开始和结束。

分享到:
评论

相关推荐

    Android 代码分析

    Android Media Scanner Process则涉及媒体文件的扫描和管理。从JAVA层初始化、预扫描到C++层处理目录,再到JAVA层扫描文件和后扫描,这个过程解释了设备如何识别并组织媒体内容。 Android Mount Daemon管理设备的...

    Android 资料又一包

    Android Media Scanner Process.pdf Talking about Android process.pdf Android Initialization Process.pdf surfaceflinger.pdf Android Build System by google.pdf auug97.pdf Android 图形系统.pdf 如何在...

    Android-Scanner-Compat-Library, 在Android上,用于蓝牙智能扫描的兼容.zip

    Android-Scanner-Compat-Library, 在Android上,用于蓝牙智能扫描的兼容 多功能扫描仪兼容程序库 扫描仪兼容的库通过在Android上扫描蓝牙智能设备解决了这个问题。 scanner在 Android 5.0中已经改变,并在 6.0中扩展...

    android BarcodeScanner源码.zip

    《Android BarcodeScanner源码解析与应用》 在移动设备领域,条形码扫描技术已经成为一个不可或缺的功能,尤其在商品管理、物联网应用以及信息快速获取等方面发挥着重要作用。Android平台上的BarcodeScanner应用...

    android BarcodeScanner3

    《Android BarcodeScanner3详解》 在移动开发领域,Android平台上的条形码扫描应用是不可或缺的一部分,其中 BarcodeScanner3 是一款高效且实用的工具。它允许用户通过手机摄像头捕获并解析各种类型的条形码,如QR...

    Android_MediaScanner__详尽分析

    在Android的原生多媒体框架中,mediaScanner的JNI实现通常位于`frameworks/base/media/jni/`目录下,文件名为`android_media_MediaScanner.cpp`。这里定义了native方法的实现,负责将Java层的扫描任务委托给底层的...

    android_media_MediaScanner.rar_android_mediascanner

    综上所述,`android_media_MediaScanner.rar_android_mediascanner`涉及的知识点广泛且深入,包括文件系统监控、媒体信息解析、SQLite操作、异常处理、性能优化、权限管理和服务组件等,这些都是Android系统中不可或...

    Andriod接收广播的类

    'android.intent.action.MEDIA_SCANNER_FINISHED' 开始扫描介质的一个目录。 'android.intent.action.MEDIA_SCANNER_STARTED' 扩展介质的挂载被解除 (unmount)。 因为它已经作为 USB 大容量存储被共享。 'android....

    Android-Scanner-Compat-Library:在Android上进行蓝牙低功耗扫描的兼容库

    Scanner Compat库解决了在Android上扫描Bluetooth Low Energy设备的问题。 最初在Android 4.3中创建的扫描仪API在Android 5.0中已更改,并在6.0和8.0中进行了扩展。 该库甚至可以在较旧的手机上使用现代API,模拟不...

    东集android开发包_scanner

    "东集android开发包_scanner"是一个专为开发者设计的工具包,它包含了东集手持设备Android端扫描功能的相关组件和示例代码,帮助开发者理解和实现条形码、二维码等扫描功能。 这个开发包的核心部分是ScannerAPI,它...

    安卓Android源码——BarcodeScanner.zip

    《安卓Android源码——BarcodeScanner深度解析》 在Android开发领域,掌握源码分析是提升技术能力的关键步骤。本文将深入探讨"BarcodeScanner"这一应用的源码,它是一款用于扫描和识别条形码和二维码的工具。通过...

    Tesseract-OCR-Scanner-master.zip_OCR_android_android ocr scanner

    Android平台OCR识别的源代码,需要的可以借鉴参考。

    Android代码-QR Scanner

    Privacy Friendly QR Scanner The Privacy Friendly QR Scanner belongs to the group of Privacy Friendly Apps. The app supports its users in detecting malicious links: QR Codes provide new possibilities ...

    Android 关于Media数据库的操作

    2. **Broadcast Intent (ACTION_MEDIA_SCANNER_SCAN_FILE)**: 发送一个广播Intent,指定ACTION_MEDIA_SCANNER_SCAN_FILE动作,这样系统媒体扫描器会扫描指定文件并将其加入数据库。 3. **利用...

    android mediaScannder框架介绍

    Android多媒体扫描框架,即Media Scanner,是Android系统中用于检测和处理媒体文件(如音频、视频和图片)的重要组件。当设备启动、媒体设备挂载或接收到特定广播意图时,MediaScannerReceiver会被触发,进而启动...

    端口扫描forAndroid

    端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid 端口扫描forAndroid

    AndroidQRCodeScanner:Android QR Code Scanner是一个用Java编写的Android应用程序,它使用Android Jetpack CameraX库与ZXing开源条形码扫描库一起预览相机和图像分析-Android app source code

    AndroidQRCodeScanner:Android QR Code Scanner是一个用Java编写的Android应用程序,它使用Android Jetpack CameraX库与ZXing开源条形码扫描库一起预览相机和图像分析

    安卓串口Socket通讯USB驱动jni相关-AndroidScanner扫描目标设备可用端口的小程序.rar

    "安卓串口Socket通讯USB驱动jni相关-AndroidScanner扫描目标设备可用端口的小程序.rar"是一个针对这一需求的解决方案。 首先,让我们理解“串口Socket通讯”。串口通信是一种古老的接口标准,广泛用于设备间的通信...

    基于barcodescanner实现Android二维码扫描功能

    基于barcodescanner实现Android二维码扫描功能 Android二维码扫描功能是当前移动应用程序中非常常见的一种基础功能。随着二维码技术的普及,二维码扫描功能已经成为许多应用程序的必备功能之一。在Android平台上...

Global site tag (gtag.js) - Google Analytics