从相机,SurfaceView或SurfaceHolder连续获取图像数据

Edd*_*eng 2 java camera android surfaceview surfaceholder

所以我设置了这个相机预览Camera,SurfaceViewSurfaceHolder.我还有一个ImageView地方,我将把相机图像的修改版本,我希望这更新让我们说每秒一次.

当我从"res"加载图像时,所有代码都准备好并且已经工作但是我很难从相机读取图像数据.

我已经尝试过了:

  1. 创建一个intentfor MediaStore.ACTION_IMAGE_CAPTURE并开始onActivityResult获取一个小缩略图(实际上足够我)(Bitmap)data.getExtras().get("data")

    问题是这会打开相机应用程序,你需要"手动"拍照.

  2. 使用创建Camera.PreviewCallback,拍摄YuvImage并将其转换为图像YuvImage.compressToJpeg(...).

    这里的问题是无论何时何地我都无法启动它 Camera.setPreviewCallbackWithBuffer(PreviewCallback).

  3. 尝试PreviewHolder通过锁定到画布直接获取数据lockCanvas()并尝试将其转换为位图

    显然不起作用.

编辑: 这项工作的最佳方法是什么?我的意思是QR码阅读器必须不断地从相机中读取图像数据,它们如何工作?

Edd*_*eng 5

我选择了2号选项,最终使它成功了.

用过这个回调,忘了@Override之前

private Camera.PreviewCallback  previewCallback= new Camera.PreviewCallback()
{   
    @Override
    public void onPreviewFrame(byte[] data,Camera cam)
    {
            Camera.Size previewSize = cam.getParameters().getPreviewSize();
            YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21,previewSize.width,previewSize.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvImage.compressToJpeg(new Rect(0,0,previewSize.width,previewSize.height),80,baos);
            byte[] jdata = baos.toByteArray();
            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata,0,jdata.length);    
    }
};
Run Code Online (Sandbox Code Playgroud)

并使用setPreviewCallback而不是使用它来启动它setPreviewCallbackWithBuffer

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() 
{   
    public void surfaceCreated(SurfaceHolder holder) {

        camera.setPreviewCallback(previewCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)