我有经典的Android应用程序,带有相机预览(常见的实现,可以在许多教程中找到[marakana等]),它应该在给定的时间间隔内拍照。完成线程和杀死线程,处理诸如"method called after release"
的错误。但有时会出现众所周知的错误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)。那么我应该以某种方式再次将表面支架分配给相机还是重新创建表面支架?
指导我就足够了,例如到一些论坛,它被描述或解决,等等。感谢您的帮助。
答案 0 :(得分:0)
在我处理照片的应用程序中,我使用了这个:
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或错误回调中设置此项。
答案 1 :(得分:0)
这就是我修复它的方法,这里是一个代码示例,认为你明白了这个想法:
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;
}