在Android上使用相机拍照后,为什么会显示所拍摄图像的预览?

时间:2014-02-24 15:18:38

标签: android android-camera surfaceview textureview

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

2 个答案:

答案 0 :(得分:0)

  

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

默认情况下不会附加任何新视图。预览就此停止。 Camera的{​​{3}}明确说明了这一点:

  

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

还接着说:

  

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

因此,再次调用startPreview()的最佳位置是JPEG回调。在此之前的任何时候,相机硬件仍在处理上一张图像,并且不会能够为您提供预览。这是“冻结”的主要原因;相机硬件只是

这也是用户的视觉提示:

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

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

  

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

通过公开公开API?当然不。完成相机处理后,您可以重新启动预览(如上所述),但是当您拨打takePicture()时,无法阻止它进行冻结。

是否有可能进一步进入相机固件,我真的不能说。但是,由于Android设备中大致使用了大量不同的摄像头,如果您不使用某个特定的设备,这可能会徒劳无功。

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

答案 1 :(得分:0)

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