介绍
这篇文章主要介绍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 nullAndroid Camera2怎么实现预览功能