20

1つのImageViewと1つのボタンを備えた非常にシンプルなアプリケーションがあります。ImageViewによってロードされた最初のDrawableリソースは、XMLレイアウトの「android:src」タグで指定されていますが、実行時に、表示される画像を変更したいと思います。これを行うには、結果のアクティビティを開始して、SDカード(MediaStore.Images.Media.EXTERNAL_CONTENT_URIに送信されたインテント)から画像を選択します。ただし、画像が選択されている場合、選択した画像のURIでImageViewを更新しようとすると、「java.lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えています」というメッセージが表示されます。

HTC-Heroのカメラ(写真サイズは約1.1M)で撮影した写真を読み込もうとしていますが、500KB未満の写真でしか動作しないようですが、カメラで撮影した写真を読み込む必要があります。どうすればこれを解決できますか?私は何を間違っているのですか。コードは非常に単純で、機能するはずです。

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
 }

}

psはアプリが行うべき唯一のことです。私は他のオブジェクトを作成していないので、画像を表示する以外に他のものにヒープスペースを使用していないことを指摘したいと思います。

4

5 に答える 5

6

これは私を夢中にさせていました。

非常に大きな高解像度のフルスクリーン画像 (800x1232) を使用して、Xoom 用にビルドしています。

次のコードは私のために働いた:

public void onStop()
{
    super.onStop();
    imageView.setImageBitmap(null);
}

幸運を!!!

于 2011-03-12T00:55:06.073 に答える
2

問題は解決されました。1行だけではなく:

((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 

ImageView コンテンツを更新する前に、次のコードを追加します。

Drawable toRecycle= gallerypic.getDrawable();
if (toRecycle != null) {
    ((BitmapDrawable)gallerypic.getDrawable()).getBitmap().recycle();
}
gallerypic.setImageURI(selectedimage);
于 2010-10-15T01:01:02.447 に答える