android - 使用android相机拍摄多张照片后出错

标签 android bitmap out-of-memory

我有一个 activity A,我正在构建自己的相机。在这个 Activity 中,相机打开,当用户按下按钮时,会拍摄一张照片。

这样做是这样的:

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();

        }
    }
};

图片被发送到第二个 Activity ,用户可以在其中查看它并查看它是否喜欢它。如果他不喜欢它,他可以重新拍摄照片

Activity 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);

               //.......
                 } 

在第二个 Activity 中,我接收图片的字节并创建第一个位图:

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

之后我需要旋转第一个位图创建第二个位图:

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

有什么想法吗?

最佳答案

您没有足够的内存来创建位图。这就是它崩溃的原因。

要释放您的内存,您应该在未使用时回收您的位图或将其保存到 SD 卡然后回收。

bitmapResult.recycle();

关于android - 使用android相机拍摄多张照片后出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256362/

相关文章:

android - 如何在自定义的 CursorAdapter 中组合 DISPLAY_NAME 和 NUMBER?

java - 循环更改位图图像

java - 任意键的锁定处理程序

Android日历添加日期

java - 解码yuv420sp单像素版本

php - 如何以android的登录形式进行json连接?

C位图给出一个高于预期的值

c# - 字符串数组为大型多行条目抛出 OutOfMemoryException

android - 如何在不出现内存不足异常的情况下获取相对于屏幕尺寸的缩放位图