Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.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
Java onCreateSurface()方法具有空摄影机对象_Java_Android_Android Camera - Fatal编程技术网

Java onCreateSurface()方法具有空摄影机对象

Java onCreateSurface()方法具有空摄影机对象,java,android,android-camera,Java,Android,Android Camera,在开发相机应用程序时,我遇到了一个错误,它第一次运行时就可以正常工作,并且只有在运行onStop方法后才会出现错误 我的逻辑是,摄影机对象将被启动,并且类的一个对象将处理摄影机的预览,然后摄影机对象将被发送到预览类 问题是,当它到达setCamera功能时,它似乎工作并设置相机,但当它到达onSurfaceCreated时,相机对象表示它为空 以下是我活动中的onResume方法: Activity.java onResume函数 if(camera == null){ camera =

在开发相机应用程序时,我遇到了一个错误,它第一次运行时就可以正常工作,并且只有在运行onStop方法后才会出现错误

我的逻辑是,摄影机对象将被启动,并且类的一个对象将处理摄影机的预览,然后摄影机对象将被发送到预览类

问题是,当它到达setCamera功能时,它似乎工作并设置相机,但当它到达onSurfaceCreated时,相机对象表示它为空

以下是我活动中的onResume方法:

Activity.java

onResume函数

if(camera == null){
   camera = Camera.open();
   camera.setDisplayOrientation(90);
   camera.startPreview();
  }

 if(preview == null){
  preview = new CameraPreview(this, camera_preview);
  preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
  preview.setKeepScreenOn(true);
  preview.setCamera(camera);
  mainLayout.addView(preview);
}
暂停方法:

if(camera != null) {
   camera.stopPreview();
   camera.release();
   camera = null;
}

if(preview != null){
   mainLayout.removeView(preview);
   preview.setCamera(null);
   preview = null;
 }
CameraPreview.java

建造师

CameraPreview(Context context, SurfaceView surfaceView){
    super(context);

    this.surfaceView = surfaceView;
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}
设置摄像头功能:

 public void setCamera(Camera temp_camera){
    camera = temp_camera;

    if(camera != null){
        supportPreviewSizes = camera.getParameters().getSupportedPreviewSizes();
        requestLayout();

        Camera.Parameters params = camera.getParameters();
        List<String>  focusMode = params.getSupportedFocusModes();

        params.setJpegQuality(10);
        params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

        // If the camera supports auto focus implement it
        if(focusMode.contains(Camera.Parameters.FOCUS_MODE_AUTO)){
            params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            camera.setParameters(params);
        }
    }
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        if(camera != null){
            camera.setPreviewDisplay(holder);
        }
    }
    catch (IOException ex){
        ex.printStrackTrace();
    }
}
你知道为什么surfaceCreated中的摄影机对象变为空吗

编辑


我发现真正的罪魁祸首不是一个空的摄像机对象,而是一个被调用的空列表。然而,当我意识到surfaceCreated被调用了两次之后,我发现了它,每次它关闭和打开时,它都会被再次调用,从而产生一种奇怪的行为,我不明白为什么会发生这种情况。

您在代码中调用
surfaceCreated()
camera
变量是否超出范围?surfaceCreated()它在mainLayout.addView(preview)之后调用。我不知道为什么会对其进行升级-我不是说这很卑鄙,而是说这很有帮助。你应该在你的帖子中提供一个,其他人可以用它来模拟/解决问题。现在,我不确定这篇帖子怎么不属于“为什么这段代码不能工作?”类别。请您查看MVCE链接,修改您的帖子,也许我们可以帮助您解决您遇到的“奇怪行为”。您在代码中调用
surfaceCreated()
camera
变量是否超出范围?surfaceCreated()它在mainLayout.addView(preview)之后调用。我不知道为什么会对其进行升级-我不是说这很卑鄙,而是说这很有帮助。你应该在你的帖子中提供一个,其他人可以用它来模拟/解决问题。现在,我不确定这篇帖子怎么不属于“为什么这段代码不能工作?”类别。请你看看MVCE链接,修改你的帖子,也许我们可以帮助你解决你所面临的“奇怪行为”。