本文分析MediaScanner对单个文件的扫描过程。单个文件的扫描是MediaScanner的基础,对路径的扫描也要用到对Media文件的扫描。本文从MediaScannerService的scanFile入口开始,详细分析了MediaScanner和MediaScannerClient对单个媒体文件的扫描处理过程。
上文对MediaScannerService的分析,知道对单个文件的扫描是调用MediaScannerService.scanFile()完成的。下面看scanFile()的实现:
scanFile()中判断如果是外部媒体文件(只扫描外部媒体文件),创建MediaScanner(定义在frameworks/base/media/java/android/media)实例,并设置locale信息,然后调用MediaScanner的scanSingleFile()开始扫描。
MediaScanner.scanSingleFile()是具体的实现。看它完成的工作:
顺序执行了
下面分章节着重讲解这些方法里面都做了哪些工作。
位于/framework/base/media/java/android/media/。
initialize()对MediaScanner的MediaProvider/Audio/Video/Image等媒体库的URI进行初始化获取,要获取的属性有下面这些:
另外,如果扫描的是外部volume,要处理playlist和genre,所以mProcessPlaylists和mProcessGenres被设置为true;创建mGenreCache;获取Genres和playlists的URI。
注意:新创建的FileCacheEntry的mSeenInFileSystem缺省值为false。
MyMediaScannerClient是MediaScanner的内部类,实现了MediaScannerClient。
MyMediaScannerClient提供了doScanFile()方法供外部调用。另外实现了MediaScannerClient这个Interface,这个Interface在JNI实现中非常重要,讲到那里时再详细阐述。
参数:path:String; mimeType: String; lastModified: long, fileSize: long
JNI调用。详细分析在文//TODO中。
- MediaStore.MediaColumns.DATA: mPath
- MediaStore.MediaColumns.TITLE: mTitle
- MediaStore.MediaColumns.DATE_MODIFIED: mLastModifed
- MediaStore.MediaColumns.SIZE: mFileSize
- MediaStore.MediaColumns.MIME_TYPE: mMimeType
- 对于Video文件
o MediaStore.MediaColumns.ARTIST: mArtist/MediaStore.UNKNOWN_STRING
o MediaStore.MediaColumns.ALBUM: mAlbum/ MediaStore.UNKNOWN_STRING
o MediaStore.MediaColumns.DURATION: mDuration
- 对于Audio文件
o MediaStore.MediaColumns.ARTIST: mArtist/MediaStore.UNKNOWN_STRING
o MediaStore.MediaColumns.ALBUM_ARTIST: mAlbumArtist/MediaStore.UNKNOWN_STRING
o MediaStore.MediaColumns.ALBUM: mAlbum/ MediaStore.UNKNOWN_STRING
o MediaStore.MediaColumns.COMPOSER: mComposer
o MediaStore.MediaColumns.YEAR: mYear
o MediaStore.MediaColumns.TRACK: mTrack
o MediaStore.MediaColumns.DURATION: mDuration
o MediaStore.MediaColumns.COMPILATION: mCompilation
新加入的Audio,写入下列信息:
- MediaStore.Audio.Media.IS_RINGTONE: ringtones
- MediaStore.Audio.Media.IS_NOTIFICATION: notifications
- MediaStore.Audio.Media.IS_ALARM: alarms
- MediaStore.Audio.Media.IS_MUSIC: music
- MediaStore.Audio.Media.IS_PODCAST: podcasts
对于JPG文件,用android.media.ExifInterface获得下列信息:
- MediaStore.Images.Media.LATITUDE;
- MediaStore.Images.Media.LONGTITUDE;
- MediaStore.Images.Media.DATE_TAKEN: gps dateTime;
- MediaStore.Images.Media.ORIENTATION。
更新一个媒体文件所属的Genre,需要更新Genres数据库,和Genres数据库对应的记录所在的Genres.Members数据库。
如果是notification/ringtone/alarm,并且还未设置notification/ringtone/alarm,那么设置Settings.System的Settings.System.NOTIFICATION_SOUND/ RINGTONE / ALARM_ALERT为媒体数据库的Uri形式。