画像をキャプチャしながらメディアスキャナーを実行したい。キャプチャ後、画像はグリッドビューで更新されます。そのためには、メディアスキャナーを実行する必要があります。実行する2つのソリューションが見つかりましたメディアスキャナー 1つはブロードキャストイベントで、もう1つはメディアの実行スキャナークラスです。アイスクリームサンドイッチ(4.0)では、メディアスキャナークラスが導入されていると思います。バージョンの前に、メディアスキャナーを実行するためのブロードキャストイベントを設定する必要があります。
メディアスキャナーを正しい方法で実行する方法を教えてもらえますか?.
ファイル名がわかっている場合は、特定のファイルでメディアスキャナーを実行するのが最善(高速/オーバーヘッドが少ない)であることがわかりました(すべてのファイルをスキャンしてメディアをスキャンするのと比較して)。これが私が使用する方法です:
/**
* 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");
}
}