0

ギャラリーから(意図的に)画像を取得しようとしています。
このエラーが発生しました:

985120-byte external allocation too large for this process.
Out of memory: Heap Size=4871KB, Allocated=2472KB, Bitmap Size=19677KB
VM won't let us allocate 985120 bytes

それは私が画像を取得する私のコードです:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   ....
   mBitmap = Media.getBitmap(this.getContentResolver(), data.getData());
   ...
}

どうすれば解決できますか?

- - - - アップデート - - - - -

既存のイメージ (HTC 写真がインストールされている) を選択すると、このエラーが発生することに気付きました。カメラから選んだ画像を選択すると、すべて正常に動作します。

したがって、このhttp://developer.android.com/training/displaying-bitmaps/load-bitmap.htmlに従ってコードを変更します。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;

InputStream stream = getContentResolver().openInputStream(data.getData());
mBitmap = BitmapFactory.decodeStream(stream,null,options);
stream.close();

しかし今、ビットマップは NULL です !!!

4

2 に答える 2

1

アプリケーションが大量の高解像度ビットマップを使用しているようです (ビットマップ メモリ パーティションは 19677KB)。「ヒープ」と「割り当て済み」のサイズはごく普通のことであり、問​​題になることはありません。未使用のビットマップをメモリから削除してください。を呼び出すbitmap.recycle()か、ビットマップへの参照を null に設定することで、メモリからビットマップを解放できます。パフォーマンス上の理由でビットマップをキャッシュしたい場合は、 LruCacheを見てください。

于 2012-08-27T18:41:05.710 に答える
0

私は常に、inSampleSize を増やし、OutOfMemoryError をキャッチする while ループでデコードをラップします。これにより、可能な限り最大の解像度の画像が得られます。常に LRU キャッシュを使用してください!

    Bitmap image;
    boolean success = false;int counter = 0;
    while (success == false && counter < 10)
    {
        try
        {
            image = BitmapFactory.decodeFile(photoPath, options);
            success = true;
        }
        catch(OutOfMemoryError e)
        {
            System.gc();
            options.inSampleSize++;
            counter++;
        }
    }
于 2012-08-27T19:44:48.457 に答える