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