OK、試行錯誤を繰り返した後、ようやく機能する例が得られたので、共有したいと思いました。この例では、画像 MediaStore をクエリし、各画像のサムネイルを取得してビューに表示します。画像を Gallery オブジェクトにロードしていますが、これはこのコードが機能するための要件ではありません。
ギャラリーの ImageAdapter がそれらにアクセスできるように、クラス レベルで定義された列インデックスの Cursor と int があることを確認してください。
private Cursor cursor;
private int columnIndex;
まず、フォルダーにあるイメージ ID のカーソルを取得します。
Gallery g = (Gallery) findViewById(R.id.gallery);
// request only the image ID to be returned
String[] projection = {MediaStore.Images.Media._ID};
// Create the cursor pointing to the SDCard
cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
MediaStore.Images.Media.DATA + " like ? ",
new String[] {"%myimagesfolder%"},
null);
// Get the column index of the image ID
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
g.setAdapter(new ImageAdapter(this));
次に、Gallery の ImageAdapter で、表示するサムネイルを取得します。
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(context);
// Move cursor to current position
cursor.moveToPosition(position);
// Get the current value for the requested column
int imageID = cursor.getInt(columnIndex);
// obtain the image URI
Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) );
String url = uri.toString();
// Set the content of the image based on the image URI
int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length()));
Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
i.setImageBitmap(b);
i.setLayoutParams(new Gallery.LayoutParams(150, 100));
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setBackgroundResource(mGalleryItemBackground);
return i;
}
このコードの最も重要なセクションは、MediaStore クエリを使用して特定のフォルダー内の画像ファイルのリストをフィルター処理する方法を示す managedQuery だと思います。