Android 错误100后重新创建摄影机对象(摄影机服务器已死亡)

Android 错误100后重新创建摄影机对象(摄影机服务器已死亡),android,android-camera,Android,Android Camera,我有一个经典的android应用程序,带有摄像头预览(常见的implem,可以在很多教程[marakana等]中找到),应该在给定的时间间隔内拍照。线程和终止线程完成后,将处理诸如发布后调用的方法“之类的错误。但有时会出现众所周知的错误100。我接受了这一事实,并试图处理它。我实现了ErrorCallback及其onError方法,在该方法中,当前摄影机对象被释放,并实例化了一个新对象,如官方文档中所述 但(毫不奇怪)这还不够。新摄像头可能分配错误,因为此时会出现消息“CameraDemo已意外

我有一个经典的android应用程序,带有摄像头预览(常见的implem,可以在很多教程[marakana等]中找到),应该在给定的时间间隔内拍照。线程和终止线程完成后,将处理诸如发布后调用的方法“之类的错误。但有时会出现众所周知的错误
100
。我接受了这一事实,并试图处理它。我实现了
ErrorCallback
及其
onError
方法,在该方法中,当前摄影机对象被释放,并实例化了一个新对象,如官方文档中所述

但(毫不奇怪)这还不够。新摄像头可能分配错误,因为此时会出现消息“CameraDemo已意外退出”。 我已经阅读了很多文件和例子,希望能在某个地方解释正确的程序,但显然没有人有这样的问题。所以我想问一下,除了发布和创建新相机,我还应该做些什么?代码如下:

ErrorCallback CEC = new ErrorCallback()
{
    public void onError(int error, Camera camera)
    {
        Log.d("CameraDemo", "camera error detected");
        if(error == Camera.CAMERA_ERROR_SERVER_DIED)
        {
            Log.d("CameraDemo", "attempting to reinstantiate new camera");
            camera.stopPreview();
            camera.setPreviewCallback(null);
            camera.release(); //written in documentation...
            camera = null;              
            camera = Camera.open();

        }
    }
};
很快-如果我在
onError
回调中释放并重新创建摄影机,则会引发释放后调用的
RuntimeException
方法(takePicture)。所以,我应该以某种方式再次将曲面保持架指定给摄影机,还是也重新创建曲面保持架


这将足以指导我,例如,到一些论坛,在那里它被描述或解决,等等。感谢任何帮助

在我的应用程序中,我使用以下命令来处理摄影机:

    public void onResume() {
    super.onResume();
if(mCamera == null)
    mCamera = getCameraInstance():
}


public static Camera getCameraInstance() {
 mCamera = null;
    try {
        mCamera = Camera.open();
Parameters parameters = mCamera.getParameters();
    mCamera.cancelAutoFocus();
    mCamera.setPreviewCallback(yourPreviewCb);
    mCamera.startPreview();
    mCamera.setParameters(parameters);

    mCamera.autoFocus(yourAutoFocusCB);
    } catch (Exception e) {
        //TODO
    }
    return mCamera;
}
getCameraInstance()中的mCamera=null只是为了确保根本没有相机在运行

我认为你需要重新创建一个完整的相机,而不仅仅是用相机打开它

camera.open();

根据您的需要,在onResume或error callback中设置此选项。

这就是我如何修复它的,下面是一个代码示例,您是否明白了这一点:

private Camera camera;

// code...

public Camera getCameraInstance() {
    Camera camera = Camera.open();
    // code...
    camera.setErrorCallback(new ErrorCallback() {
        @Override
        public void onError(int error, Camera camera) {
            if(error == Camera.CAMERA_ERROR_SERVER_DIED) {
                releaseCamera();
                startCamera();
            }
        }
    });
    return camera;
}

protected void startCamera() {
    if(getCamera() == null)
        setCamera(getCameraInstance());
    refreshCamera();
}

protected void releaseCamera() {
    if (getCamera() != null) {
        getCamera().release();
        setCamera(null);
    }
}

public Camera getCamera() {
    return camera;
}

public void setCamera(Camera camera) {
    this.camera = camera;
}

你找到解决办法了吗?请分享警告!当曲面更改(例如大小)时调用
surfaceChanged
时,如果未重新生成
相机
对象,则如果屏幕大小已更改,将导致错误100。这是由于修改了摄像头屏幕而导致的崩溃(在较旧的设备上,摄像头有时会滞后并卡住,导致预览屏幕大小改变)换句话说,一定要注意
表面更改
,它也容易产生错误100。