1、简介
2、camera参数设置
3、布局设置
4、获取预览回调参数
5、常见问题
1、简介
在调用相机时我们经常需要获取预览信息,比如人脸比对时需要将相机的流截取出来转为图片,用于人脸识别。
2、camera参数设置
2.1 创建Camera对象
在Activity的Oncreate()中开启相机;
if(mCamera==null){
if(bfrontSwitch){
mCamera=Camera.open(1);//前置
rotation=270;
}else{
mCamera=Camera.open(0);//后置
rotation=90;
}}
2.2 设置相机参数
mCamera.setDisplayOrientation(90);
parameters=mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);//default默认为21,所有手机均支持NV21
parameters.setPreviewSize(WIDHT,HEIGHT);//设置预览分辨率
parameters.setPreviewFrameRate(25);
if(!bfrontSwitch)//后置需要自动对焦,否则人脸采集照片模糊
{
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
mCamera.setParameters(parameters);
注意:在设置该参数时,绝大部分的参数我们是可以通过mCamera.getParameters().XX 获取该手机支持的参数。例如:
List
mCamera.setPreviewCallback(this);//开启Camera预览回调,重写onPreviewFrame获取相机回调
mCamera.startPreview();//开启预览
mCamera.cancelAutoFocus();//聚焦
经过以上三点,我们就完成对于相机参数的设置和开启,理论上我们已经将相机打开,由于需要实时预览,因此我们必须将相机获取到的数据展示出来,这里就需要使用第三点布局的设置,这个布局可以使用SurfaceView实现。
3、布局设置
对于布局的设置比较简单,就是普通的surfaceview布局
<SurfaceView
android:id="@+id/id_surface_view_unlock"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
在activity的onCreate中设置SurfaceView参数
mSurfaceView=(SurfaceView)findViewById(R.id.id_surface_view);//获取surfaceView控件
mSurfaceHolder=mSurfaceView.getHolder();//获取holder参数
mSurfaceHolder.addCallback(new SurfaceHolderCB());//设置holder的回调
在相机预览时,就可以通过设置Camera参数展示界面
mCamera.setPreviewDisplay(mSurfaceHolder);
刚刚提到的回调主要包括以下三个参数
privateclassSurfaceHolderCBimplementsSurfaceHolder.Callback{
@Override
publicvoidsurfaceCreated(SurfaceHolderholder){
startPreview();
}
@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){
}
@Override
publicvoidsurfaceDestroyed(SurfaceHolderholder){
stopPreview();
}}
startPreview()中我们对相机参数设置,并将holder的回调与相机关联,在stopPreview()执行相机资源的回收。
在第二步的mCamera.setPreviewCallback(this)中设置相机回调预览是我们此篇的重点,通过Activity实现,Camera.PreviewCallback方法,重写onPreviewFrame(byte[]data,Camera camera)获取摄像机的预览参数。
Camera.SizepreviewSize=camera.getParameters().getPreviewSize();
YuvImageimage=newYuvImage(data,ImageFormat.NV21,previewSize.width,previewSize.height,null);
ByteArrayOutputStreamstream=newByteArrayOutputStream();
image.compressToJpeg(newRect(0,0,previewSize.width,previewSize.height),80,stream);
Bitmapbmp=BitmapFactory.decodeByteArray(stream.toByteArray(),0,stream.size());
注意相机预览获取到的data数据不能直接转为bitmap存储,因为该数据是YUV格式的,需要进行数据转换。