Android Camera获取预览流

camera获取预览流的方法有两种:
方法1 直接显示setPreviewDisplay,方法2 使用previewCallback
第一种
1 需要一个surfaceview
2在权限允许和surfaceview onCreate 成功后,打开camera,并且把surfaceview的holder设置在camera的setDisplayPreview上。
3 为Camera设置一些Camera.Parameters,之后startPreview。
4 在onPause时stopPreview、releaseCamera,否则Camera被占用,其他程序无法使用相机。
具体代码分析如下:
在onCreate中获取surfaceView的holder并且添加当前的activity为回调函数。
SurfaceHolderholder=mSurfaceView.getHolder();//取得holder
holder.setFormat(PixelFormat.TRANSLUCENT);
holder.setKeepScreenOn(true);
holder.addCallback(this);//holder加入回调接口
在onPause中,初始化相机,主要是参数的设定。然后调用回调函数surfaceCreate。
当surfaceview发生变化时,调用回调函数surfaceChanged。
//设置显示
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();

在onPause()中完成释放相机的操作。

以上过程中,涉及到几个重要的概念:
surfaceView是视图(View)的继承类,surfaceView控制这个surface的绘制位置。
surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,surface的排版显示受到视图层级关系的影响,它的兄弟视图节点会在顶端显示。
我们可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。

surfaceview提供了两个线程:UI线程和渲染线程。

第二种方法
首先定义一个类实现Camera.PreviewCallback接口,然后在它的onPreviewFrame(byte[] data, Camera camera)方法中即可接收到每一帧的预览数据,也就是参数data。
然后使用setPreviewCallback(), setOneShotPreviewCallback或者setPreviewCallbackWithBuffer()注册回调接口。
最后使用addCallbackBuffer(byte[] callbackBuffer)添加一个预分配的缓冲区到预览回调缓冲区队列中。这个方法只有在使用setPreviewCallbackWithBuffer(PreviewCallback)时才有必要使用。当使用setPreviewCallback(PreviewCallback)或者setOneShotPreviewCallback(PreviewCallback)时,缓冲区会自动分配。

你可能感兴趣的:(Android Camera获取预览流)