Привет всем, Я много искал для своей проблемы, я нашел много сообщений с похожими проблемами, но никто не дал мне правильного решения. Что я хочу - это gridview, отображающий изображения папки sdcard. Я также должен предложить возможность сделать снимок, и, возвращаясь к gridview, обновите его с новым изображением.Отображать изображения подпапки sdcard в gridview и обновлять их при изменениях
Чтобы сделать снимок, я использую этот код:
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;
}
Этот код работает, но очень медленно и не update (миниатюры новых изображений не создаются), даже если я снова вызову свою функцию displayGallery() в onActivityResult(). Ну, он не обновляется, даже если я перезагрузите приложение> <. Я должен запустить его снова из затмения.
Фактически, то, что я хотел бы, это то же поведение, что и ES File Explorer (при открытии папки изображения имеют все изображение предварительного просмотра, и они загружаются асинхронно), что, я думаю, не использует те * * thumbnails.
Поэтому я попытался загрузить изображения в виде растровых изображений с использованием растровой фабрики, но даже с несколькими изображениями (1-2) я сразу получаю «размер растрового изображения java.lang.OutOfMemoryError: превышает бюджет VM» ... Думаю, я должен изменить их размер, но если я это сделаю, разве у меня будет такая же ошибка, когда я загружу 20-30 фотографий? Или проблема в том, что каждая фотография превышает бюджет, и поэтому, если я изменю их размер, я избегу этой ошибки для всех из них?
Извините за большой пост, если кто-то может помочь ...