在surfaceChanged中释放相机对象会导致强制关闭(空指针异常)

时间:2014-02-12 06:29:48

标签: android nullpointerexception android-camera surfaceview preview

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

..........
.......

  public void surfaceCreated(SurfaceHolder holder) {
    ........
    ..........
    // I create camera object with camera.open
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // I start camera preview successfully and call my function.
   Myfunction();
   //this function does some checking (a separate thread ) n releases camera object immediately and also release the camera preview
  }
}

现在,当控件离开此功能时,我仍然在onsurfaceChanged(),我在Null Pointer exception处获得了一个强制关闭(SurfaceView (564))。我知道这个错误是因为我发布了相机及其表面视图。根据android的文档,在onsurfaceChanged()

之后,surfaceCreated();被称为至少一次

所以我的查询错误是我在控件退出onsurfaceChanged()之前释放了相机对象及其预览版本?我的要求是我检查一些情况如果创建预览时,如果条件为假,则释放相机,即startPreview();onsurfaceChanged()内部执行某项任务。

有什么方法可以检测到onsurfaceChanged()被调用一次然后我可以触发Myfunction();

1 个答案:

答案 0 :(得分:2)

简单的解决方法是在回调后使用CameraPreview.post()释放相机

public class CameraPreview … {

    void Myfunction() {
        …
        this.post(new Runnable() { 
            public void run() {
                mCamera.release();
                mCamera = null;
            }
        }
        …
    }
}