У меня есть очень простое приложение с одним ImageView и Кнопкой. Первый ресурс Drawable, загруженный моим ImageView, определяется с тегом "android:src" в Расположении XML, однако во времени выполнения, я хочу изменить изображение, отображенное им. Чтобы сделать так, я запускаю Действие для результата для выбора изображения от SD-карты (намерение, отправленное MediaStore. Изображения. Медиа. EXTERNAL_CONTENT_URI). Однако, когда изображение выбрано, я пытаюсь обновить ImageView с URI выбранного изображения, но я получаю сообщение "java.lang. OutOfMemoryError: растровый размер превышает бюджет VM"
I'am, пытающийся загрузить снимки, сделанные камерой (размер рисунков вокруг 1.1M) моего HTC Hero, но никакого успеха, кажется, работает только с изображениями, которые являются меньше, чем 500KB.However, я должен загрузить снимки, сделанные камерой. Как я могу решить это? что я делаю неправильно. Кажусь мне, что код очень прост и должен работать.
public void onClick(View v){
Intent selectImageIntent=new Intent(Intent.ACTION_PICK ,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(selectImageIntent,1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK){
Uri selectedImageUri = data.getData();
Log.i(TAG,"chosen image: "+selectedImageUri.toString());
ImageView imageView = (ImageView) this.findViewById(R.id.ImageView01);
imageView.setImageURI(selectedImageUri);//here I get the OutOfMemoryError
imageView.invalidate();
}else{
//canceled
}
}
p.s., который является единственной вещью Приложение, должен сделать, я не создаю другие объекты, таким образом, мне понравится указывать, что я не использую пространство "кучи" для другого материала помимо отображения изображения.
Похоже, перед загрузкой нового Bitmap мне пришлось переработать Bitmap, отображаемый ImageView, теперь он работает без проблем. Надеюсь, это поможет кому-то другому, просто вызовите следующий метод перед установкой нового содержимого ImageView.
((BitmapDrawable) imageView.getDrawable ()). GetBitmap (). Recycle ();
поэтому код теперь выглядит следующим образом:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case INTENT_REQUEST_SELECT_IMAGE:
if(resultCode==Activity.RESULT_OK){
Uri selectedImageUri = data.getData();
Log.i(TAG,"selectedImageUri.getPath()"+selectedImageUri.getPath() );
ImageView imageView = (ImageView) this.findViewById(R.id.ImageView_of_text);
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
imageView.setImageURI(selectedImageUri);
imageView.invalidate();
}else{
//TODO define what to do in case the user canceled OCR or any other event
}
break;
default:
break;
}
}
Обратите внимание на вызов для повторного использования растрового изображения ImageView.