Android:当我使用AsyncTask打开相机时,如何确保相机被正确释放?
我正在使用AsyncTask在后台线程中打开相机。它工作正常,但有时有10%的几率它不会释放相机,如果我再次打开我的应用程序,我将有一个空白的预览屏幕,并且本机相机会对我大叫,说你没有释放相机资源 下面是我的异步任务代码 这里是获取相机方法 最后一种方法是设置摄像机 暂停法Android:当我使用AsyncTask打开相机时,如何确保相机被正确释放?,android,android-camera,Android,Android Camera,我正在使用AsyncTask在后台线程中打开相机。它工作正常,但有时有10%的几率它不会释放相机,如果我再次打开我的应用程序,我将有一个空白的预览屏幕,并且本机相机会对我大叫,说你没有释放相机资源 下面是我的异步任务代码 这里是获取相机方法 最后一种方法是设置摄像机 暂停法 当我的应用程序打开时,我可以通过按下锁屏按钮产生相同的错误。如果从UI线程打开它,您是否也有相同的问题?@rupps否。如果我在UI线程上打开相机,它工作正常。但是我们不应该在主线程中进行,因为这可能需要一些时间。是的,我想
当我的应用程序打开时,我可以通过按下锁屏按钮产生相同的错误。如果从UI线程打开它,您是否也有相同的问题?@rupps否。如果我在UI线程上打开相机,它工作正常。但是我们不应该在主线程中进行,因为这可能需要一些时间。是的,我想,但是一些复杂的对象在从后台线程创建/初始化时不能很好地工作,例如,如果他们创建了一个处理程序,并假设它将在UI线程中创建。试着打电话给Looper.prepare in doInBackground,看看情况是否如此。顺便说一句,我认为打开相机不会阻塞,即使预览图像显示需要一些时间!
private class AsyncCamera extends AsyncTask<Void, Void, Camera> {
int _id = 0;
public AsyncCamera(int id) {
_id = id;
}
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
releaseCameraAndPreview();
}
protected Camera doInBackground(Void... params) {
Camera camera;
camera = getCamera(_id);
return camera;
}
protected void onPostExecute(Camera camera) {
mCamera = camera;
setCamera(camera);
safeToTakePicture = true;
progressBar.setVisibility(View.GONE);
}
}
private void releaseCameraAndPreview() {
setCamera(null);//to stop preview and clear frame layout
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
private Camera getCamera(int id) {
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
} catch (Exception e) {
Log.e(getString(R.string.app_name), "failed to open Camera");
e.printStackTrace();
}
return mCamera;
}
public void setCamera(Camera camera) {
if (camera == null) {
if (mCamera != null) {
mCamera.stopPreview();
}
return;
} else {
//set parameters.clear frame layout and add view to it and start preview
mCamera = camera;
params = mCamera.getParameters();
setPictureAndPreviewSize();
if (mCamera != null) {
mPreview = new Preview(getApplicationContext(), mCamera);
mPreviewLayout.removeAllViews();
mPreviewLayout.addView(mPreview);
}
}
}
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mPreview.getHolder().removeCallback(mPreview);
mCamera.release();
mCamera = null;
}
}