我有一个应用程序,客户端使用相机拍照。在用户点击“点击”按钮之前,使用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()回调的字节数组中的图像?
提前谢谢!! =)
答案 0 :(得分:1)
不幸的是,你只能通过调用stopPreview()来获取一个合理的好的预览图像,因为在拍摄照片的那一刻和调用onPictureTaken()的那一刻之后,它可以通过相当长的一段时间,因为它的工作原理如下: p>
因此,您必须将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();
}