Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android MediaScanner.cpp 源代碼解析

Android MediaScanner.cpp 源代碼解析

編輯:關於Android編程

1. 簡介

實現對文件夾的遞歸掃描
libmedia – libmedia.so
frameworksavmedialibmediaMediaScanner.cpp

2. 對文件的掃描

由JNI調用processDirectory,然後由doProcessDirectory和doProcessDirectoryEntry實現對文件夾的遞歸掃描。

2.1 doProcessDirectory

循環掃描該文件夾內的所有項

MediaScanResult MediaScanner::doProcessDirectory(
        char *path, int pathRemaining, MediaScannerClient &client, bool noMedia) {
    char* fileSpot = path + strlen(path);
    struct dirent* entry;
    .....
    // Treat all files as non-media in directories that contain a  .nomedia file
    .....
    //Skip .nomedia file

    DIR* dir = opendir(path);

    MediaScanResult result = MEDIA_SCAN_RESULT_OK;
    while ((entry = readdir(dir))) {
        if (doProcessDirectoryEntry(path, pathRemaining, client, noMedia, entry, fileSpot)
                == MEDIA_SCAN_RESULT_ERROR) {
            result = MEDIA_SCAN_RESULT_ERROR;
            break;
        }
    }
    closedir(dir);
    return result;
}

2.2 doProcessDirectoryEntry

判斷該項目是文件、文件夾還是需要跳過的項。
if 文件夾
doProcessDirectory
else if 文件
通過JNI調用java層scanFile
else if skip
skip this file or folder

MediaScanResult MediaScanner::doProcessDirectoryEntry(
        char *path, int pathRemaining, MediaScannerClient &client, bool noMedia,
        struct dirent* entry, char* fileSpot) {
    struct stat statbuf;
    const char* name = entry->d_name;
    ........
    int type = entry->d_type;
    if (type == DT_UNKNOWN) {
        if (stat(path, &statbuf) == 0) {
            if (S_ISREG(statbuf.st_mode)) {
            //文件
                type = DT_REG;
            } else if (S_ISDIR(statbuf.st_mode)) {
            //文件夾
                type = DT_DIR;
            }
        }
    }
    if (type == DT_DIR) {
        bool childNoMedia = noMedia;
        // set noMedia flag on directories with a name that starts with '.'
        // for example, the Mac .Trashes directory
        if (name[0] == '.')
            childNoMedia = true;

        // report the directory to the client
        if (stat(path, &statbuf) == 0) {
            status_t status = client.scanFile(path, statbuf.st_mtime, 0,
                    true /*isDirectory*/, childNoMedia);
            if (status) {
                return MEDIA_SCAN_RESULT_ERROR;
            }
        }

        // and now process its contents
        strcat(fileSpot, /);
        MediaScanResult result = doProcessDirectory(path, pathRemaining - nameLength - 1,
                client, childNoMedia);
        if (result == MEDIA_SCAN_RESULT_ERROR) {
            return MEDIA_SCAN_RESULT_ERROR;
        }
    } else if (type == DT_REG) {
        stat(path, &statbuf);
        status_t status = client.scanFile(path, statbuf.st_mtime, statbuf.st_size,
                false /*isDirectory*/, noMedia);
        if (status) {
            return MEDIA_SCAN_RESULT_ERROR;
        }
    }

    return MEDIA_SCAN_RESULT_OK;
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved