我有一个客户端用相机拍照的应用程序。在用户点击我的“点击”按钮之前,使用surfaceview在平板电脑上显示图像预览。当用户点击点击按钮时,调用pictureTaken方法,在该方法中,我保存图像并调用camera.stopperReview()方法(这样用户就可以看到拍摄的照片)。
不过,有一个问题……如果用户在拍摄图片时正在移动平板电脑,则调用stoppreview方法后实际显示的静态图片与我在onpicturetaken方法的字节数组中得到的图片不对应。当用户在拍照前移动平板电脑时,会有一些毫秒的延迟,这就使得这一点与众不同(我知道99%的人在拍照时不会移动平板电脑,但我的客户确实注意到了这个问题,希望它修好了…。我已尝试将save操作移动到separate线程,如下所示,以便onpicturetaken方法可以尽快执行。不过,它没有任何效果…

private PictureCallback pictureCallback = new PictureCallback() {

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

        camera.stopPreview();
        reference = data;

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

我还尝试在调用TakePicture方法之前调用camera.stopperReview()(而不是在onPictureTaken()方法内部)。但结果是一样的。
要同步stoppreview方法以便准确显示已拍摄的图像以及onPictureTaken()回调的字节数组中的图像,我可以做些什么?
提前谢谢你!=)

最佳答案

不幸的是,仅通过调用stoppreview()无法获得合理的良好预览图像,因为从拍摄照片到调用onPictureTaken()之间可能会经过相当长的时间,因为它的工作方式如下:
相机实际拍摄照片(这是你想要预览的)
onshutter()被调用
为原始图像数据调用onPictureTaken()(在某些设备上)
调用缩放预览图像的onPictureTaken()(在某些设备上)
最后压缩图像数据的onPictureTaken()被调用(我们在这里讨论的那个)
因此,您必须将onPictureTaken()回调函数中的byte[] data转换为位图,并将该位图映射到应位于SurfaceView上方的ImageView上,以显示静态预览图像。
代码可能如下所示:

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();
}

10-05 18:35