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

标签 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() 中,我在 SurfaceView (564) 处收到强制关闭(空指针异常) 。我知道这个错误是因为我释放了相机及其表面 View 。根据android的文档,onsurfaceChanged()surfaceCreated();之后至少被调用一次

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

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

最佳答案

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

public class CameraPreview … {

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

关于android - 在 surfaceChanged 中释放相机对象会导致强制关闭(空指针异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21720347/

相关文章:

java - 在 Android 应用程序中建立 Java 服务器和客户端之间的连接编辑

android - 仅在按钮上水平和垂直居中图标(而不是文本)

java - 什么是NullPointerException,我该如何解决?

android - 在不滞后屏幕预览的情况下获取android camera2预览帧

android - 使用postgresql在android studio(kotlin)中插入记录

android - 借助 MergeAdapter、StickyListHeaders 和 ListViewAnimations 的强大功能,我是 Android 的队长

Java新手试图找出NullPointerException和

android - 自定义适配器 getView 中的 NullPointerException

android - 在 API 8 之前获取 Android 相机文件夹

android - 在 Android 中打开相机时音频播放停止?