0

当我调用mCamera.takePicture(null, null, null, null);(为简单起见,我省略了回调)时,预览会冻结并显示刚刚捕获的场景的预览。为什么会这样。我可以以某种方式控制这种行为吗?而且,实际发生了什么?是否有附加的新视图或我的相机预览简单停止?

4

2 回答 2

0

实际发生了什么?是否有附加的新视图或者我的相机预览只是停止了?

默认情况下不会附加任何新视图。预览刚刚停止。的文档Camera清楚地说明了这一点:

拍照后预览将停止;如果要重新开始预览或拍摄更多照片,调用者必须再次调用 startPreview()。

它还继续说:

调用此方法后,在 JPEG 回调返回之前,您不得调用 startPreview() 或拍摄另一张照片。

因此,再次调用的最佳位置startPreview()是 JPEG 回调。在此之前的任何时间,相机硬件仍在处理之前的图像,并且无法您提供预览。这是它“冻结”的主要原因相机硬件很忙

这也是对用户的视觉提示:

  • 拍了一张照片
  • 图片看起来像“这个”

这是锦上添花,但即使你不在乎,它仍然会这样做。

我可以以某种方式控制这种行为吗?

通过公开的 API?当然不。一旦相机完成处理(如上),您可以重新开始预览,但是当您调用takePicture().

是否有可能通过进一步研究相机固件,我真的不能说。但是,由于 Android 设备中使用的摄像头种类繁多,因此如果您不使用特定设备,这可能是徒劳的。

即使使用一种特定的设备,我也看不出你是如何完全克服它的。至少,相机将忙于处理图像一段时间即使是我见过的高端数码单反相机,至少在曝光期间也会冻结预览。

于 2014-02-24T15:49:58.483 回答
0

调用 takePicture() 后,您可以将预览表面隐藏在另一个视图(例如 ImageView)下。如果您使用 OpenGL 而不是 SurfaceView 来渲染预览纹理,那么您的技巧就更多了。

于 2014-02-24T21:19:26.000 回答