Android(相机) - 如何将stopPreview()与onPictureTaken()同步?

时间:2012-06-07 00:11:05

标签: android camera sync surfaceview preview

我有一个应用程序,客户端使用相机拍照。在用户点击“点击”按钮之前,使用SurfaceView在平板电脑中显示图像的预览。当人按下单击按钮时,调用onPictureTaken方法,并且在该方法中,我保存图像并调用camera.stopPreview()方法(这样用户就可以看到拍摄的图片)。

但是有一个问题......如果用户在拍摄照片时正在平板电脑中移动,调用stopPreview方法后实际显示的静态图片不会对应于那个我进入了onPictureTaken方法的字节数组。当用户在拍摄照片之前在平板电脑周围移动时,有一些延迟会使这种差异突出(我知道99%的人在拍照时不会移动平板电脑,但我的客户实际上注意到了这个问题,并希望它修复...)。我试图将保存操作移动到separete线程,如下所示,因此onPictureTaken方法可以尽快执行。尽管如此,它根本没有任何影响......

private PictureCallback pictureCallback = new PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {

        camera.stopPreview();
        reference = data;

        new PictureCallbackHeavy().execute();
    }
};

在调用takePicture方法之前(而不是在onPictureTaken()方法中),我还可以调用camera.stopPreview()。但结果是一样的。

我可以做什么来同步stopPreview方法,这样我就可以完全显示所拍摄的图像以及onPictureTaken()回调的字节数组中的图像?

提前谢谢!! =)

1 个答案:

答案 0 :(得分:1)

不幸的是,你只能通过调用stopPreview()来获取一个合理的好的预览图像,因为在拍摄照片的那一刻和调用onPictureTaken()的那一刻之后,它可以通过相当长的一段时间,因为它的工作原理如下: p>

  • 相机实际上拍摄了照片(这就是您要预览的内容)
  • onShutter()被称为
  • onPictureTaken()用于调用原始图像数据(在某些设备上)
  • onPictureTaken()用于缩放预览图像(在某些设备上)
  • 调用最终压缩图像数据的
  • onPictureTaken()(我们在这里讨论的那个)

因此,您必须将onPictureTaken()回调中的byte[] data转换为位图,并将该位图映射到ImageView上,您应将其放置在SurfaceView上方以显示静态预览图像。 代码可能看起来像这样:

public void onPictureTaken(byte[] data, Camera camera) {
    camera.stopPreview();
    final Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);
    surfaceView.setVisibility(SurfaceView.GONE);
    imageView.setVisibility(ImageView.VISIBLE);
    imageView.setImageBitmap(image);
    reference = data;
    new PictureCallbackHeavy().execute();
}