现象:

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

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

    

02-12 14:48:41.580: E/AndroidRuntime(6997): FATAL EXCEPTION: main02-12 14:48:41.580: E/AndroidRuntime(6997): java.lang.RuntimeException: takePicture failed02-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

        


更多相关文章

  1. 同时使用AndroidX库和bufferknife库报 package android.support.
  2. 【Android】 Eclipse : ERROR: Unknown option '--no-crunch'的
  3. 【资源】Android(安卓)Developer网站无法访问问题的解决之道
  4. Kotlin学习路(五):变量延迟初始化
  5. Android(安卓)MediaPlayer播放异常问题汇总
  6. Android如何通过scheme跳转界面
  7. Android(安卓)WebView使用基础
  8. android 开发故障记录
  9. 如何在Ubuntu12.1下安装Android(安卓)NDK(r8b)

随机推荐

  1. android实现进度条ProgressDialog
  2. Android(安卓)获取设备唯一UUID
  3. Android实现主动连接蓝牙耳机
  4. Android自动化测试之MonkeyRunner之Monke
  5. 在 Android(安卓)Emulator 中开发 LKM 程
  6. Android(安卓)返回键退出
  7. Clickable URLs in Android(安卓)TextVie
  8. Android(安卓)HTTP请求
  9. android imageVIew拖动 && 图片缩放
  10. android 广播 android Service 开机启动