33、android java.lang.RuntimeException: takePicture failed
16lz
2021-01-25
现象:
在开发自定义相机时,调用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
更多相关文章
- 同时使用AndroidX库和bufferknife库报 package android.support.
- 【Android】 Eclipse : ERROR: Unknown option '--no-crunch'的
- 【资源】Android(安卓)Developer网站无法访问问题的解决之道
- Kotlin学习路(五):变量延迟初始化
- Android(安卓)MediaPlayer播放异常问题汇总
- Android如何通过scheme跳转界面
- Android(安卓)WebView使用基础
- android 开发故障记录
- 如何在Ubuntu12.1下安装Android(安卓)NDK(r8b)