Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:当我使用AsyncTask打开相机时,如何确保相机被正确释放?_Android_Android Camera - Fatal编程技术网

Android:当我使用AsyncTask打开相机时,如何确保相机被正确释放?

Android:当我使用AsyncTask打开相机时,如何确保相机被正确释放?,android,android-camera,Android,Android Camera,我正在使用AsyncTask在后台线程中打开相机。它工作正常,但有时有10%的几率它不会释放相机,如果我再次打开我的应用程序,我将有一个空白的预览屏幕,并且本机相机会对我大叫,说你没有释放相机资源 下面是我的异步任务代码 这里是获取相机方法 最后一种方法是设置摄像机 暂停法 当我的应用程序打开时,我可以通过按下锁屏按钮产生相同的错误。如果从UI线程打开它,您是否也有相同的问题?@rupps否。如果我在UI线程上打开相机,它工作正常。但是我们不应该在主线程中进行,因为这可能需要一些时间。是的,我想

我正在使用AsyncTask在后台线程中打开相机。它工作正常,但有时有10%的几率它不会释放相机,如果我再次打开我的应用程序,我将有一个空白的预览屏幕,并且本机相机会对我大叫,说你没有释放相机资源

下面是我的异步任务代码

这里是获取相机方法

最后一种方法是设置摄像机

暂停法


当我的应用程序打开时,我可以通过按下锁屏按钮产生相同的错误。

如果从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;
    }
 }