33、android java.lang.RuntimeException: takePicture failed

现象:

        在开发自定义相机时,调用mCamera.takePicture(null, null, new Camera.PictureCallback() {} 偶现无法拍照问题。

debug发现 报了异常错误  被try{}catch(){} 捕捉了。

    

02-12 14:48:41.580: E/AndroidRuntime(6997): FATAL EXCEPTION: main
02-12 14:48:41.580: E/AndroidRuntime(6997): java.lang.RuntimeException: takePicture failed
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.hardware.Camera.native_takePicture(Native Method)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.hardware.Camera.takePicture(Camera.java:1126)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.hardware.Camera.takePicture(Camera.java:1071)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at app.cam.shane.CameraLauncherActivity$3.onClick(CameraLauncherActivity.java:116)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.view.View.performClick(View.java:4223)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.view.View$PerformClick.run(View.java:17275)
02-12 14:48:41.580: E/AndroidRuntime(6997):     at android.os.Handler.handleCallback(Handler.java:615)
   

原因:

    经过分析 发现快速点击拍照按钮导致的原因;因此需要添加一个条件

处理:

    1、定义一个变量:

        

private boolean safeToTakePicture = false;

    2、在camera.startPreview() 后 初始化变量

camera.startPreview();
safeToTakePicture = true;


    3、在 camera.takePicture()添加

if (safeToTakePicture) {
    mp.start();
    camera.takePicture(null, null, onPictureTaken); 
    safeToTakePicture = false;
}

    4、在 onPictureTaken()回调的最后添加

safeToTakePicture = true;


完整代码:

    

public void takePicture(final TakePictureCallback callback) {
    if (isPreviewing) {
      
        try {
            mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    isPreviewing = true;
                    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                    Matrix matrix = new Matrix();
                    if (SELECTED_CAMERA == CAMERA_POST_POSITION) {
                        matrix.setRotate(nowAngle);
                    } else if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {
                        matrix.setRotate(360 - nowAngle);
                        matrix.postScale(-1, 1);
                    }

                    bitmap = createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                    if (callback != null) {
                        if (nowAngle == 90 || nowAngle == 270) {
                            callback.captureResult(bitmap, true);
                        } else {
                            callback.captureResult(bitmap, false);
                        }
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        isPreviewing = false;
    }
}

    参考:

             点击打开链接 

            点击打开链接2

        


猜你喜欢

转载自blog.csdn.net/fdoubleman/article/details/80801000