单个文件扫描流程

待解决: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插入数据库中


posted @ 2012-09-28 12:07  tanqiantot  阅读(314)  评论(0编辑  收藏  举报