Android Camera2 相机预览、获取数据
Camera2简要说明
在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2),大幅提高了Android系统拍照的功能,还能支持RAW照片输出,允许程序调整相机的对焦模式、曝光模式、快门等
源码地址
https://github.com/WuKaik/QuickCamera.git
需要了解camera2的几个重要类
- CameraManager: 管理设备上的所有摄像头设备,主要是获取摄像头列表和打开指定的摄像头
- CameraCharacteristics:摄像头特性,该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性
- CameraDevice: 具体的摄像头设备,主要是创建CaptureSession和CaptureRequest
- CameraCaptureSession: 相机捕获会话,主要是处理拍照和预览,需要预览、拍照时,都需要先通过该类的实例创建 Session
- CaptureRequest.Builder:负责生成CameraRequest对象
- CaptureRequest: 通过CaptureRequest.Builder.build()后得到的一次捕获请求,用于描述捕获图片的各种参数设置,比如对焦模式、曝光模式……
使用简要说明
- 获取CameraManager
- 调用CameraManager.getCameraCharacteristics()方法得到CameraCharacteristics
- 调用CameraManager.open()方法在回调中得到CameraDevice
- 通过CameraDevice.createCaptureRequest()得到CaptureRequest.Builder,构建CaptureRequest对象
- 通过CameraDevice.createCaptureSession() 在回调中获取CameraCaptureSession
- 通过 CameraCaptureSession发送CaptureRequest, capture表示只发一次请求, setRepeatingRequest表示不断发送请求.
- 在ImageReader.OnImageAvailableListener回调中获取拍照数据
主要代码截图
/*** 开始预览* 使用TextureView显示相机预览数据* Camera2的预览和拍照数据都是使用CameraCaptureSession会话来请求的*/private void startPreview() {SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();//设置TextureView缓冲区大小surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());//获取Surface显示数据Surface surface = new Surface(surfaceTexture);try {//设置捕获请求为预览(还有其它,如拍照、录像)mCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);//可以通过这个set(key,value)方法,设置曝光啊,自动聚焦等参数!!//mCaptureBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);//获取ImageReader(ImageFormat不要使用jpeg,预览会出现卡顿)mReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2);//设置有图像数据流时监听mReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {//需要调用acquireLatestImage()和close(),不然会卡顿Image image = reader.acquireLatestImage();//将这帧数据转成字节数组,类似于Camera1的PreviewCallback回调的预览帧数据ByteBuffer buffer = image.getPlanes()[0].getBuffer();byte[] data = new byte[buffer.remaining()];buffer.get(data);//Log.d(TAG, "onImageAvailable: data size"+data.length);image.close();}}, mHandler);//设置预览界面为数据的显示mCaptureBuilder.addTarget(surface);mCaptureBuilder.addTarget(mReader.getSurface());//创建相机捕获会话mCameraDevice.createCaptureSession(Arrays.asList(surface, mReader.getSurface()), mCaptureStateCallback, mHandler);} catch (CameraAccessException e) {e.printStackTrace();}}
private CameraCaptureSession.StateCallback mCaptureStateCallback = new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {//创建捕获请求mCaptureRequest = mCaptureBuilder.build();mCameraSession = session;try {//设置反复捕获数据的请求,这样预览界面就会一直有数据显示mCameraSession.setRepeatingRequest(mCaptureRequest, null, mHandler);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {}};
Android Camera2 相机预览、获取数据相关推荐
- Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现
一.前言 Android自定义相机开发中,常常会有通过手势放大或缩小相机预览画面的需求,即数码变焦DigitalZoom. 二.接口说明 1. 获取最大的放大倍数 float maxZoom = mC ...
- android 圆形相机预览拍照_Android多种方式实现相机圆形预览
最终效果图如下: 一.为预览控件设置圆角 public RoundTextureView(Context context, AttributeSet attrs) { super(context, a ...
- android 圆形相机预览拍照_Android多种方式实现相机圆形预览的示例代码
效果图如下: 一.为预览控件设置圆角 public RoundTextureView(Context context, AttributeSet attrs) { super(context, att ...
- 关于SurfaceView相机预览获取Bitmap的方法
为什么80%的码农都做不了架构师?>>> 昨天在网上找了很久SurfaceView截屏方法,canvas转bitmap方法...... 发现国内网站上太多坑了!!!Google ...
- android自定义相机预览尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像扭曲...
混合来自OpenGL和 Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为128 ...
- android+相机画面旋转,Android:相机预览的屏幕方向/旋转
我已经创建了一个相机应用程序,我想让我的应用程序在所有4个可能的方向转换,并相应地更新相机预览.因为我已经使用我从以下复制的以下方法: Android – Camera preview is side ...
- Android Camera相机预览,拍照 ,横屏竖屏的处理
功能分别是: 1.竖屏的前置,后置显示 加 拍照 2.横屏的前置,后置显示 加 拍照 整个项目的代码贴出来了,里面加了有备注,不理解的也可以去参考官网点击跳转到官网 首先选择前置后置布局效果如下 布局 ...
- Android Camera1相机预览
切换相机 / void switchCamera(int facing); /* 设置Facing / void setCameraFacing(int facing); /* 获取Facing / ...
- Android调用相机预览黑屏app passed NULL surface解决
由于项目需求,要实现一个调用相机拍照然后将矩形框中的部分切割出来的功能,于是在网上找了 一个PlayCamera的demo程序.但运行的时候发现,只有第一次安装上时拍照界面能成功预览,一旦用back按 ...
最新文章
- javabean属性的类型选择包装类还是基本数据类型
- zabbix3.0禁用guest用户
- 数据分析:2020年3月汽车工业经济运行情况
- 循环往list中add对象却总是add的是一个对象
- sap.ui.layout.form.SimpleForm.prototype
- 2021-09-211547G - How Many Paths?
- 少儿是先学计算机 还是学机器人,机器人学习和少儿编程有什么区别?
- android 加载大长图,android加载长图片的方法
- mysql组合索引与字段顺序
- 吴恩达神经网络和深度学习-学习笔记-39-计算机视觉现状
- 学生信息管理系统[有软件截图]
- VMware虚拟机下载、安装与使用
- 安装ie11提示计算机安装了更新的版本,离线安装IE11浏览器提示quot;获取更新quot;解决方法 - 191路由网...
- java可视化工作流_强大的java工作流引擎,可视化开发工作流
- 基于W800的AIOT离在线一体方案说明 (阿里飞燕+离线语音控制)
- LaTeX新手入门以及TeXlive和TeXstudio的安装使用
- 最全的Excel-sumif函数多条件求和案例汇总
- PHP用GD库实现简单的验证码
- java实现文字识别营业执照识别(百度、讯飞)
- 对吃鸡APP的逆向分析