こんにちは、私は自分の問題をたくさん検索しました。同様の問題を持つ投稿がたくさん見つかりましたが、誰も私に正しい解決策を教えてくれませんでした。私が欲しいのは、sdcard フォルダーの画像を表示するグリッドビューです。また、写真を撮る可能性を提供する必要があり、グリッドビューに戻るときに新しい写真で更新します。
写真を撮るには、次のコードを使用します。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageFileUri());
startActivityForResult(intent, TAKE_PICTURE_ACTIVITY);
getImageFileUri() はタイムスタンプ付きの画像名を提供する関数で、Environment.getExternalStorageDirectory() を使用して sdcard パスを取得し、フォルダーが存在するかどうかを確認します (存在しない場合は作成します)。
とりあえず、カーソルを使用して画像を取得します。
private void displayGallery() {
// Query params :
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID};
String selection = MediaStore.Images.Media.DATA + " like ? ";
String[] selectionArgs = {"%Otiama%"};
// Submit the query :
mCursor = managedQuery(uri, projection, selection, selectionArgs, null);
if (mCursor != null) {
mGridView.setOnItemClickListener(this);
mGridView.setAdapter(new ImageAdapter(this, mCursor));
}
else showToast("Gallery is empty : " + uri.toString());
}
そして、ここに私のアダプターの getView があります:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
// Move cursor to current position
mCursor.moveToPosition(position);
// Get the current value for the requested column
int columnIndex = mCursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
int imageID = mCursor.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(mContext.getContentResolver(), originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
imageView.setImageBitmap(b);
return imageView;
}
このコードは機能しますが、onActivityResult() で displayGallery() 関数を再度呼び出しても、非常に遅く更新されません (新しい画像のサムネイルが作成されません)。うーん、アプリをリロードしても更新されない><。日食からもう一度実行する必要があります。
実際、私が望むのは、ES ファイル エクスプローラー (フォルダーを開くと、すべての写真にプレビュー イメージがあり、非同期で読み込まれる) と同じ動作であり、これらの* * サムネイルを使用しないと思います。 .
そのため、ビットマップ ファクトリを使用して画像をビットマップとして読み込もうとしましたが、いくつかの画像 (1-2) を使用しても、すぐに「java.lang.OutOfMemoryError: ビットマップ サイズが VM の予算を超えています」というメッセージが表示されます...それらのサイズを変更しますが、そうすると、20〜30枚の写真をロードするときに同じエラーが発生しませんか?? または、各写真が予算を超えているという問題があるため、サイズを変更すると、すべての写真でこのエラーを回避できますか?
大きな投稿で申し訳ありませんが、誰かが助けてくれれば...