首页 > 解决方案 > 使用自定义相机拍照时出现 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

仍然没有运气

标签: android

解决方案


我想你忘了在你的相机对象上调用 startPreview() 方法。来自官方文档:

6.重要:调用 startPreview() 开始更新预览表面。必须先开始预览,然后才能拍照。

https://developer.android.com/reference/android/hardware/Camera


推荐阅读