待解决:uri:mnt/external/image
mnt/external/file的作用是什么
ICS的单个文件mediascnner扫描流程如下:
主要过程均在mediascanner.java文件
1、beginfile
主要是对文件进行一些预处理:
1)预先根据文件后缀设定mimetype
if (mFileType == 0 ) {
// tanqian add end
MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
if (mediaFileType != null) {
mFileType = mediaFileType.fileType;
if (mMimeType == null) {
mMimeType = mediaFileType.mimeType;
}
}
}
2)维护一个filecache表,判断该文件是否是新建的文件或者是否有修改,如果有修改的话,则置标记位,这样真正扫描文件时就只扫描那些有标记位的文件。
FileCacheEntry entry = mFileCache.get(key);
// add some slack to avoid a rounding error
long delta = (entry != null) ? (lastModified - entry.mLastModified) : 0;
boolean wasModified = delta > 1 || delta < -1;
if (entry == null || wasModified) {
if (wasModified) {
entry.mLastModified = lastModified;
} else {
entry = new FileCacheEntry(0, path, lastModified,
(isDirectory ? MtpConstants.FORMAT_ASSOCIATION : 0));
mFileCache.put(key, entry);
}
entry.mLastModifiedChanged = true;
}
entry.mSeenInFileSystem = true;
2、开始doscanfile
根据之前预置的mimetype来判断是否进行mimetype的解析,只有audio和video会解析,图片也会解析,普通的file文件不解析
if (MediaFile.isAudioFileType(mFileType)
|| MediaFile.isVideoFileType(mFileType) || mIsinSoundpath) {
// tanqian add end
processFile(path, mimeType, this);
}
if (MediaFile.isImageFileType(mFileType)) {
processImageFile(path);
}
result = endFile(entry, ringtones, notifications, alarms, music, podcasts);
}
注:此处的processFile最终会调用stagefrightMediascanner.cpp中的方法进行mimetype的解析:
sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);
status_t status = mRetriever->setDataSource(path);
if (status) {
return MEDIA_SCAN_RESULT_ERROR;
}
const char *value;
if ((value = mRetriever->extractMetadata(
METADATA_KEY_MIMETYPE)) != NULL) {
status = client.setMimeType(value);
if (status) {
return MEDIA_SCAN_RESULT_ERROR;
}
}
此处client.setMimeType(value)又会回调到java中的setMImeType,将解析后的数据重新复制。
3、最后endFile,将解析好的value插入数据库中