android - 使用自定义相机拍照时出现 RuntimeException - “takePicture failed”
问题描述
错误发生在内部CameraFragment
- 一个仅包含 FrameLayout(用于保存相机预览)和 ImageButton(用于捕获图像)的片段。在我的片段中,我有一个 PictureCallback:
private static Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
CameraFragment.DATA=data;
final int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_STORAGE
);
return;
}
saveImageToDevice();
}
};
我从 HandlerThread 获取我的 Camera 实例:
private CameraHandlerThread mThread = null;
private static class CameraHandlerThread extends HandlerThread {
Handler mHandler = null;
private Camera handlerCamera;
CameraHandlerThread() {
super("CameraHandlerThread");
start();
mHandler = new Handler(getLooper());
}
synchronized void notifyCameraOpened() {
notify();
}
void openCamera() {
mHandler.post(new Runnable() {
@Override
public void run() {
handlerCamera = getCameraInstance();
notifyCameraOpened();
}
});
try {
wait();
}
catch (InterruptedException e) {
}
}
public Camera getCamera() {
return handlerCamera;
}
}
然后我在 OnCreateView() 中调用这个方法(发生异常的地方):
private void launchCamera() {
newOpenCamera();
mPreview = new CameraPreview(getContext(), mCamera, activity);
mPreview.setCameraDisplayOrientation(activity, CAMERA_ID, mCamera);
preview = (FrameLayout) view.findViewById(R.id.tvCamera);
preview.addView(mPreview);
ivCaptureImage = (ImageView) view.findViewById(R.id.ivCaptureImage);
ivCaptureImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.takePicture(null, null, mPicture);
}
});
}
newOpenCamera 在哪里:
private void newOpenCamera() {
if (mThread == null) {
mThread = new CameraHandlerThread();
}
synchronized (mThread) {
mThread.openCamera();
mCamera = mThread.getCamera();
}
}
我已经运行了调试器,可以看到发生错误的行(launchCamera() 中的 mCamera.takePicture(...))被调用,但错误在 PictureCallback 之前被抛出。错误是:
E/UncaughtException: java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1523)
at android.hardware.Camera.takePicture(Camera.java:1468)
at com.myapp.myapp.camera.CameraFragment$2.onClick(CameraFragment.java:175)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
05-28 17:09:22.600 1171-1171/com.myapp.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapp.myapp, PID: 1171
java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1523)
at android.hardware.Camera.takePicture(Camera.java:1468)
at com.myapp.myapp.camera.CameraFragment$2.onClick(CameraFragment.java:175)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
有谁知道可能出了什么问题?如您所见,每拍摄一张照片,我总是会遇到两个相同的错误。
非常感谢任何帮助,干杯。
编辑:
我已经设置了警卫来阻止单点触摸注册为多点,如下所述:java.lang.RuntimeException: takePicture failed
仍然没有运气
解决方案
我想你忘了在你的相机对象上调用 startPreview() 方法。来自官方文档:
6.重要:调用 startPreview() 开始更新预览表面。必须先开始预览,然后才能拍照。
https://developer.android.com/reference/android/hardware/Camera
推荐阅读
- svg - 在svg中的矩形周围添加同心线
- python - 如何以高 FPS 记录我的电脑屏幕?
- elasticsearch - Kibana 中的 % 计算似乎不正确
- python - 如何在 python 中为 sigmoid 函数删除这些循环
- python - Discord.py int 没有属性 send
- loops - 将 2 个动态长度数组添加到第 3 个数组
- spring-cloud-dataflow - 如何删除 Spring Cloud Data Flow 应用程序属性?
- python - 将eos发送到管道后无法保存mp4视频
- reactjs - 在 Draft.JS 编辑器和 Formik 中使用 useImperativeHandle 钩子是否合理?
- r - 从 CSV 在 R 中创建散点图