Java 在Android应用程序中拍照后,如何有效地重新启动预览?

Java 在Android应用程序中拍照后,如何有效地重新启动预览?,java,android,camera,Java,Android,Camera,我正在尝试编写一个工具,以指定的时间间隔(如timelapse)拍摄照片,但在第一次拍摄后很难让相机复位,以便可以在下一张照片上开始拍摄 以下是所用代码的示例: // gets called with the oncreate method and loads a preview fine public void startUpPreview(){ mCamera = getCameraInstance(); mPreview = new CameraPreview(this,

我正在尝试编写一个工具,以指定的时间间隔(如timelapse)拍摄照片,但在第一次拍摄后很难让相机复位,以便可以在下一张照片上开始拍摄

以下是所用代码的示例:

// gets called with the oncreate method and loads a preview fine
public void startUpPreview(){ 
    mCamera = getCameraInstance();
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);
}

// gets called from a later loop
public void getPicture() {
    mCamera.takePicture(null, null, mPicture);
    releaseCamera();
    startUpPreview();
}
使用上面的代码,它会抛出错误:

java.lang.RuntimeException:在release()之后调用的方法

我使用的是直接取自SDK指南的发行代码,该代码在其他情况下有效:

private void releaseCamera(){
    if (mCamera != null){
        mCamera.release();        
        mCamera = null;
    }
}
对于单个图片,使用休眠线程添加延迟可以使其正常工作:

try {
        Thread.sleep(1000);
        releaseCamera();
        startUpPreview();
} catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
}
但当尝试拍摄多张照片时,此代码在循环中不起作用。我假设在所有的照片拍摄都能赶上之前,这个循环已经完成了

提前感谢任何人提供的任何帮助。

takePicture()
启动捕获过程,该过程以调用
onPictureTaken()
回调(异步)结束。你们不应该在结束前松开相机

执行循环的伪代码如下所示:

onCLick() { // <-- start the loop
  count = 0;
  takePicture()
}

onPictureTaken() {
  savePicture(count);
  count++;
  if (count < maxCount) {
      mCamera.startPreview();
      mHandler.postDelayed(runTakePicture(), 1000);
  }
  else {
      releaseCamera();
  }
}

runTakePicture() {
   return new Runnable() {
      public void run() {
        mCamera.takePicture();
      }
   }
}

onCLick(){/@user1992200每次OP请求延迟1秒。但我的实验表明,虽然一些设备,例如三星S4,显然可以在零延迟下工作,但其他设备,例如OnePlus 1,如果拍摄未延迟至少100毫秒,则会失败