单个文件扫描流程

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


转载于:https://www.cnblogs.com/tanqiantot/archive/2012/09/28/3126851.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值