フォルダのサムネイルビューを機能させることができませんでした。代わりに、フォルダー内の最初の画像でギャラリーを起動することで、ほぼ同じように優れたものを管理しました。
これが私が達成したかったことの説明です。ユーザーはリストビューから特定のレコードを選択します。このレコードには、いくつかの画像を関連付けることができます。Nexus OneのクールなGallery3Dアプリを使用してこれらの画像を閲覧できるようにしたかったのです(現在はマルチタッチズーム付きです!)。そのレコードの画像がデバイスのSDカードにまだキャッシュされていない場合は、zipファイルとしてダウンロードします。次に、そのファイルをSDカード上のそのレコードのキャッシュディレクトリに抽出します。その後、ギャラリーを起動して、そのキャッシュディレクトリ内の画像のみを表示したいと思いました。
ダウンロードを実行し、zipファイルをSDカードに抽出することは問題ではありませんでした。ただし、ギャラリーを機能させるには、MediaScannerConnectionClientでMediaScannerConnectionを使用する必要がありました。スキャナーを接続させた後(これは一種の不安定なものでした)、scanner.scanFileを呼び出してキャッシュディレクトリ内のすべてのファイルをループしました。
MediaScannerConnectionClient#onScanCompletedは、結果のURIをArrayListメンバー変数に追加します。プロセス全体が完了したら、ギャラリーを起動して、そのリストの最初のURIを渡します。これにより、ディレクトリの最初の画像が表示されます。サムネイル表示の方がよかったのですが、これで十分です。
私はこの解決策に完全に満足しているわけではありません。MediaScannerConnectionは非同期で動作しているようです。そのため、AsyncTaskはポーリング/スリープを実行して、スキャンが完了したかどうかを確認します。
MediaScannerConnectionが最初の呼び出しで接続しないという問題が他にありましたか?これを回避するために、私は次のようなことをしています。
MediaScannerConnection scanner = ...;
for (int attempts = 0; attempts < MAX_ATTEMPTS; attempts++) {
scanner.connect();
if (scanner.isConnected()) { break; }
else {
try { Thread.sleep(5); }
catch (Exception e){}
}
}
if (!scanner.isConnected()) {
throw new IllegalStateException("Unable to establish media scanner connection!");
}
醜いですが、なぜ初めて接続するのに問題があるのかわかりません。:-/
更新:jeffamaphoneのおかげで、その醜いコードをダンプすることができました。これで、OnItemClickListenerはscanner.connect()を呼び出すだけです。スキャナーのコンストラクターに渡されるクライアントは、DownloadAsyncTaskを初期化します。DownloadAsyncTaskは、ファイルを解凍してscanner.scanFiles(...);を呼び出すときにProgressDialogを更新します。