Как запустить медиа-сканер в Android

Я новичок в Android. Я хочу запустить медиа-сканер во время захвата изображения. После захвата изображения оно обновляется в виде сетки. Для этого мне нужно запустить медиа-сканер. Я нашел два решения для запуска медиа-сканера: одно - широковещательное событие, а другое - класс медиа- сканера. Я думаю, что в Ice Cream Sandwich (4.0) представлен класс медиа-сканера. Перед версиями необходимо установить широковещательное событие для запуска медиа-сканера.

Может ли кто-нибудь направить меня, как правильно запустить медиа-сканер.

1 ответ

Я обнаружил, что лучше всего (быстрее / с наименьшими затратами) запускать сканер мультимедиа для определенного файла (вместо запуска его для сканирования всех файлов на наличие мультимедиа), если вы знаете имя файла. Вот метод, который я использую:

/**
 * Sends a broadcast to have the media scanner scan a file
 * 
 * @param path
 *            the file to scan
 */
private void scanMedia(String path) {
    File file = new File(path);
    Uri uri = Uri.fromFile(file);
    Intent scanFileIntent = new Intent(
            Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
    sendBroadcast(scanFileIntent);
}

Когда мне нужно запустить несколько файлов (например, при инициализации приложения с несколькими изображениями), я сохраняю коллекцию имен файлов новых изображений при инициализации, а затем запускаю описанный выше метод для каждого нового файла изображения. В приведенном ниже коде addToScanList добавляет файлы для сканирования в ArrayList<T>, а также scanMediaFiles используется для запуска сканирования каждого файла в массиве.

private ArrayList<String> mFilesToScan;

/**
 * Adds to the list of paths to scan when a media scan is started.
 * 
 * @see {@link #scanMediaFiles()}
 * @param path
 */
private void addToScanList(String path) {
    if (mFilesToScan == null)
        mFilesToScan = new ArrayList<String>();
    mFilesToScan.add(path);
}

/**
 * Initiates a media scan of each of the files added to the scan list.
 * 
 * @see {@see #addToScanList(String)}
 */
private void scanMediaFiles() {
    if ((mFilesToScan != null) && (!mFilesToScan.isEmpty())) {
        for (String path : mFilesToScan) {
            scanMedia(path);
        }
        mFilesToScan.clear();
    } else {
        Log.e(TAG, "Media scan requested when nothing to scan");
    }
}
Другие вопросы по тегам