16

画像のキャプチャ中にメディア スキャナを実行したい。キャプチャ後、画像はグリッド ビューで更新されます。そのためには、メディア スキャナーを実行する必要があります。メディア スキャナーを実行する 2 つのソリューションを見つけました。1つはブロードキャスト イベントで、もう 1 つはメディアスキャナー クラスを実行しています。Ice Cream Sandwich (4.0) では、メディア スキャナ クラスが導入されていると思います。以前のバージョンでは、メディア スキャナを実行するためのブロードキャスト イベントを設定する必要があります。

メディア スキャナを正しい方法で実行する方法を教えてください。

4

1 に答える 1

31

ファイル名がわかっている場合は、特定のファイルに対してメディア スキャナを実行する (すべてのファイルをスキャンしてメディアをスキャンするよりも) のが最適 (高速/最小オーバーヘッド) であることがわかりました。私が使用する方法は次のとおりです。

/**
 * 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");
    }
}
于 2012-11-07T13:39:52.410 に答える