Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PreviewCallback中的android摄像头发布错误_Android_Android Camera - Fatal编程技术网

PreviewCallback中的android摄像头发布错误

PreviewCallback中的android摄像头发布错误,android,android-camera,Android,Android Camera,所以我读了一遍摄像头API,没有找到任何关于这个的信息。我用相机抓拍画面,效果非常好,直到我试着松开相机。我在一系列调用中复制了错误: camera = Camera.open(); camera.setPreviewDisplay(getHolder()); Parameters params = camera.getParameters(); List<Size> ls = params.getSupportedPreviewSizes(); Size size = ls.get

所以我读了一遍摄像头API,没有找到任何关于这个的信息。我用相机抓拍画面,效果非常好,直到我试着松开相机。我在一系列调用中复制了错误:

camera = Camera.open();
camera.setPreviewDisplay(getHolder());
Parameters params = camera.getParameters();
List<Size> ls = params.getSupportedPreviewSizes();
Size size = ls.get(1);
this.width = size.width;
this.height = size.height;
params.setPreviewSize(size.width, size.height);
camera.setParameters(params);
camera.setDisplayOrientation(90);
camera.setPreviewCallback(this);
camera.startPreview();
camera.stopPreview();
camera.release();
所以不管发生什么事都不在我的函数中。
如果我注释掉相机。setPreviewCallback(这个);然后此错误不会出现,但我显然丢失了回调,这就是将摄像头包含在我的应用程序中的全部意义。

您必须在
camera.release()
之前、
camera.stopReview()之后取消预览回调:


否则,它可能会在相机被释放后被调用。

作为旁注,完整的
releaseCamera
方法如下所示:

// release Camera for other applications
private void releaseCamera() {
    // check if Camera instance exists
    if (mCamera != null) {
        sPreviewing = false;
        // first stop preview
        mCamera.stopPreview();
        // then cancel its preview callback
        mCamera.setPreviewCallback(null);
        // and finally release it
        mCamera.release();
        // sanitize you Camera object holder
        mCamera = null;
    }
}

这对我也有用。其他stackoverflow回答也提到了这一点,但对我来说关键是需要在camera.stopPreview和camera.release()之间完成。谢谢如果这没有帮助,试着遵循一个稍微不同的建议:就是这样,这就是所有必要的!只是要小心把它放在正确的位置,因为我的问题是我有第二个位置,我试图
stopPreview()
,当然它崩溃了..@Apostrofix,为了停止摄像头,如果您在多个位置使用它,您可能需要创建另一个方法,或者在停止之前检查“mCamera”对象是否为null。我也遇到了同样的问题,我使用的一般规则是,任何摄像头调用都可以在任何时间引发RuntimeException,即使特定呼叫没有正式记录此异常。如果您的测试设备从未以这种方式出现问题,请确保硬件、ROM和已安装软件的某些不幸叠加将以可复制或不可复制的方式导致此崩溃。
camera.setPreviewCallback(null);
// release Camera for other applications
private void releaseCamera() {
    // check if Camera instance exists
    if (mCamera != null) {
        sPreviewing = false;
        // first stop preview
        mCamera.stopPreview();
        // then cancel its preview callback
        mCamera.setPreviewCallback(null);
        // and finally release it
        mCamera.release();
        // sanitize you Camera object holder
        mCamera = null;
    }
}