ошибка после нескольких снимков с помощью камеры Android - PullRequest
2 голосов
/ 31 августа 2011

У меня есть activity A, где я строю свою собственную камеру. В этом упражнении камера открывается, и когда пользователь нажимает кнопку, делается снимок.

Это делается так:

Activity A:
  //this button needs to be pressed to take the photo

  public void onClick(View arg0) {
  mCamera.takePicture(null, mPictureCallback, mPictureCallback);
            }

  //the method that gets called
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {

        if (imageData != null) {
            Intent mIntent = new Intent();


            Bundle b = new Bundle();
            b.putByteArray("imageData", imageData);
            Intent i = new Intent(mContext, ViewPhoto.class);
            i.putExtras(b);
            startActivity(i);

            setResult(FOTO_MODE, mIntent);
            finish();

        }
    }
};

Изображение отправляется на второй вид деятельности, где пользователь может просмотреть его и посмотреть, нравится ему это или нет. Если ему это не нравится, он может затем повторно сделать фотографию

Упражнение B:

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
                //..........
       Bundle extras = getIntent().getExtras();
       BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2;
    byte[] imageData = extras.getByteArray("imageData");
    Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
            imageData.length, options);

    Matrix mat = new Matrix();
    mat.postRotate(90);
    bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(),
            myImage.getHeight(), mat, true);

               //.......
                 } 

В этом втором задании я получаю байты изображения и создаю первый bitmap:

 Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);

После этого мне нужно повернуть first bitmapсоздание второго растрового изображения:

bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(),
                myImage.getHeight(), mat, true);

После того, как пользователь увидит bitmapResult, он может повторно сделать фотографию.

backTakePhoto.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            //...back to activity A
        }
    });

Проблема заключается в том, что после нескольких фотографий получаются циклы:

 activity A->activity B->activity A->Activity B my app crashes in activity B at this line:

bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(),
                myImage.getHeight(), mat, true);

А вот так выглядит мой logcat:

 FATAL EXCEPTION: main
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
at com.Xperiaproject.ViewPhoto.onCreate(ViewPhoto.java:71)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
at android.app.ActivityThread.access$1500(ActivityThread.java:121)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
at dalvik.system.NativeStart.main(Native Method)
Force finishing activity com.Xperiaproject/.ViewPhoto

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

У вас недостаточно памяти для создания вашего растрового изображения. Вот почему он падает.

Чтобы освободить память, вы должны утилизировать растровое изображение, если оно не используется, или сохранить его на SD-карту, а затем утилизировать.

bitmapResult.recycle();
2 голосов
/ 31 августа 2011

Запись следующего кода при событии нажатия кнопки.

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

Метод onActivityResult: -

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == CAMERA_PIC_REQUEST) {
                System.out.println("Dipak Keshariya");
                drawable=null;
                bmpImage=null;
                bmpImage = (Bitmap) data.getExtras().get("data");
                System.out.println("Image Path is:- " +data.getExtras().get("data"));
                drawable = new BitmapDrawable(bmpImage);
                mImageviewmain.setVisibility(View.VISIBLE);
                mImageviewmain.setImageDrawable(drawable);
            }
        }
}

Объявить следующую переменную / объекты глобально: -

Растровое изображение bmpImage;

Drawable Drawable;

...