java.lang.OutOfMemoryError в андроиде при сохранении снимка, сделанного с камеры - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть приложение, в котором мне нужно сохранять свои изображения в SDCard после их снятия с камеры.

Вот код:

camera.takePicture(myShutterCallback, myPictureCallback_RAW,
                        myPictureCallback_JPG);

PictureCallback myPictureCallback_JPG = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {

            Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0,
                    arg0.length);

            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream(UploadedFilename);
            } catch (FileNotFoundException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }

            final Bitmap result = Bitmap.createScaledBitmap(bitmapPicture, 640,
                    480, false);

Код бомбы на этой линии:

Растровое изображение bitmapPicture = BitmapFactory.decodeByteArray (arg0, 0, arg0.length);

Указывает свой класс:

Класс исключения java.lang.OutOfMemoryError Метод источника BitmapFactory.nativeDecode().

Пожалуйста, помогите

1 Ответ

4 голосов
/ 02 февраля 2012

Если вы просто хотите сохранить изображение на SD-карте, вам не нужно создавать растровое изображение.Допустим, вы хотите получить изображение шириной> 640 пикселей:

final int DESIRED_WIDTH = 640;

// Set inJustDecodeBounds to get the current size of the image; does not
// return a Bitmap
final BitmapFactory.Options sizeOptions = new BitmapFactory.Options();
sizeOptions.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(data, 0, data.length, sizeOptions);
Log.d(TAG, "Bitmap is " + sizeOptions.outWidth + "x"
            + sizeOptions.outHeight);

// Now use the size to determine the ratio you want to shrink it
final float widthSampling = sizeOptions.outWidth / DESIRED_WIDTH;
sizeOptions.inJustDecodeBounds = false;
// Note this drops the fractional portion, making it smaller
sizeOptions.inSampleSize = (int) widthSampling;
Log.d(TAG, "Sample size = " + sizeOptions.inSampleSize);

// Scale by the smallest amount so that image is at least the desired
// size in each direction
final Bitmap result = BitmapFactory.decodeByteArray(data, 0, data.length,
        sizeOptions);

В BitmapFactory.Options

есть множество других интересных настроек.
...