Android Camera2怎么实现预览功能

  介绍

这篇文章主要介绍Android Camera2怎么实现预览功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强> 1。概述

最近在做一些关于人脸识别的项目,需要用到Android相机的预览功能。网上查阅相关资料后,发现Android 5.0及以后的版本中,原有相机的API已经被Camera2 API所取代。

全新的Camera2在相机的基础上进行了改造,大幅提升了Android系统的拍照功能。它通过以下几个类与方法来实现相机预览时的工作过程:

?CameraManager:摄像头管理器,主要用于检测系统摄像头,打开系统摄像头等;
?CameraDevice:用于描述系统摄像头,可用于关闭相机,创建相机会话,发送拍照请求等;
?CameraCharacteristics:用于描述摄像头所支持的各种特性;
?CameraCaptureSession:当程序需要预览,拍照时,都需要先通过CameraCaptureSession来实现。该会话通过调用方法setRepeatingRequest()实现预览;
?CameraRequest:代表一次捕获请求,用于描述捕获图片的各种参数设置;
? CameraRequest。建造者:负责生成CameraRequest对象。

<强> 2。相机预览

下面通过源码来讲解如何使用Camera2来实现相机的预览功能。

<强> 2.1相机权限设置

& lt; uses-permission  android: name=癮ndroid.permission.CAMERA",/在

<强> 2.2应用布局

? activity_main。xml

& lt; ? xml  version=?.0“,编码=皍tf-8" ?比;   & lt; FrameLayout  xmlns: android=癶ttp://schemas.android.com/apk/res/android"   ,xmlns:工具=癶ttp://schemas.android.com/tools"   ,android: id=癅 + id/container"   ,android: layout_width=癿atch_parent"   ,android: layout_height=癿atch_parent"   ,android:背景=? 000“   ,工具:上下文=?MainActivity"祝辞   & lt;/FrameLayout>   fragment_camera.xml ?   & lt; ? xml  version=?.0“,编码=皍tf-8" ?比;   & lt; RelativeLayout  xmlns: android=癶ttp://schemas.android.com/apk/res/android"   ,xmlns:工具=癶ttp://schemas.android.com/tools"   ,android: layout_width=癿atch_parent"   ,android: layout_height=癿atch_parent"   ,工具:上下文=?CameraFragment"祝辞   & lt; com.lightweh.camera2preview.AutoFitTextureView   ,android: id=癅 + id/textureView"   ,android: layout_width=皐rap_content"   ,android: layout_height=皐rap_content"   ,android: layout_centerVertical=皌rue"   ,android: layout_centerHorizontal=皌rue",/比;   & lt;/RelativeLayout>

<强> 2.3相机自定义观点

public  class  AutoFitTextureView  extends  TextureView  {   ,private  int  mRatioWidth =, 0;   ,private  int  mRatioHeight =, 0;   ,public  AutoFitTextureView (Context 上下文),{   ,这(上下文,null);   ,}   ,public  AutoFitTextureView (Context 上下文,AttributeSet  attrs), {   此(上下文,attrs,,, 0);   ,}   ,public  AutoFitTextureView (Context 上下文,AttributeSet  attrs,, int  defStyle), {   ,超级(上下文,attrs, defStyle);   ,}   ,public  void  setAspectRatio (int 宽度,,int 高度),{   ,if  (width  & lt;, 0, | |, height  & lt;, 0), {   ,throw  new  IllegalArgumentException (“Size  cannot  be 负!”);   ,}=,mRatioWidth 宽度;   ,mRatioHeight ,=,高度;   ,requestLayout ();   ,}   ,@Override   ,protected  void  onMeasure (int  widthMeasureSpec, int  heightMeasureSpec), {   ,super.onMeasure (widthMeasureSpec, heightMeasureSpec);   ,int  width =, MeasureSpec.getSize (widthMeasureSpec);   ,int  height =, MeasureSpec.getSize (heightMeasureSpec);   ,if  (0,==, mRatioWidth  | |, 0,==, mRatioHeight), {   ,setMeasuredDimension(宽度,高度);   ,}else  {   ,if  (width  & lt;, height  *, mRatioWidth /, mRatioHeight), {   ,setMeasuredDimension(宽度,width  *, mRatioHeight /, mRatioWidth);   ,}else  {   ,setMeasuredDimension (height  *, mRatioWidth /, mRatioHeight,,高度);   ,}   ,}   ,}   }

<强> 2.4动态申请相机权限

public  class  MainActivity  extends  AppCompatActivity  {   ,private  static  final  int  REQUEST_PERMISSION =, 1;   ,@Override   ,protected  void  onCreate (Bundle  savedInstanceState), {   ,super.onCreate (savedInstanceState);   ,setContentView (R.layout.activity_main);   ,if  (hasPermission ()), {   ,if  (null ==, savedInstanceState), {   ,setFragment ();   ,}   ,}else  {   ,requestPermission ();   ,}   ,}   ,@Override   ,public  void  onRequestPermissionsResult (int  requestCode, String 权限[],int [], grantResults), {   ,if  (requestCode ==, REQUEST_PERMISSION), {   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Android Camera2怎么实现预览功能