我有带相机预览的经典 Android 应用程序(可以在许多教程 [marakana 等] 中找到的常见实现),它应该在给定的时间间隔内拍照。线程和终止线程已完成,处理诸如“释放后调用的方法”
之类的错误。但有时会发生众所周知的错误 100
。我接受了它发生的事实并试图处理它。我实现了 ErrorCallback
及其 onError
方法,其中释放了当前相机对象并实例化了一个新的对象,如官方文档中所写。
但是(毫不奇怪)这还不够。新相机可能分配错误,因为现在出现消息 “CameraDemo has been exited unexpectedly”
。
我已经阅读了许多文档和示例,希望能够在某个地方解释适当的程序,但显然没有人遇到这样的问题。所以我想问问除了发布和创造新相机,我还应该做什么?这是代码:
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 或错误回调中设置它。
关于android - 错误 100 后重新创建相机对象(相机服务器已死),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957107/