Android:Camera2的简单使用
以前用的是Camera,但是现在Camera已经被官方弃用了,所以这里使用的是Camera2进行演示
使用Camera需要注意的就是权限的获取,必须有权限
类图介绍
Camera2跟Camera1不一样,它使用了很多个类,每个类有自己的功能
这几个类是主要使用的,其他的比如 CameraCharacteristics 类用于获取跟摄像头有关的信息等等
代码实现
1、CameraManager获取系统摄像头
1 CameraManager cameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
2、CameraManager打开指定摄像头,让Device进行操作
String cameraId = "" + CameraCharacteristics.LENS_FACING_FRONT;//得到后摄像头编号 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
} CameraDevice.StateCallback deviceCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
cameraDevice = camera;
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) { }
@Override
public void onError(@NonNull CameraDevice camera, int error) {
Log.e(TAG,"cameraManager打开摄像头失败");
}
}; try {
cameraManager.openCamera(cameraId, deviceCallback, null);
} catch (CameraAccessException e) {
Log.e(TAG,"cameraManager访问摄像头失败");
}
3、使用CaptureRequest.Builder 指定配置信息和画面图片的传递
CaptureRequest.Builder previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//将预览数据传递
previewRequestBuilder.addTarget(imageReader.getSurface());
previewRequestBuilder.addTarget(surfaceHolder.getSurface()); // 自动对焦
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 打开闪光灯
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
4、Device创建Session进行预览
cameraDevice.createCaptureSession(Arrays.asList(surfaceHolder.getSurface(), imageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) { cameraCaptureSession = session; CaptureRequest captureRequest = previewRequestBuilder.build();
try {
cameraCaptureSession.setRepeatingRequest(captureRequest,captureCallback,cameraHandler); } catch (CameraAccessException e) { Log.e(TAG,"cameraCaptureSession访问摄像头失败");
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) { }
},null);
在参数中的surfaceHolder是当前画面的SurfaceView,imageReader是在下面进行定义的
5、使用imageReader对预览的图片进行操作
final int MAX_PREVIEW_WIDTH = 1920;
final int MAX_PREVIEW_HEIGHT = 1080; //imageReader通过将得到的图片存放在队列中,再取出来进行操作
//队列满了就不再放入新的图片,设置图片队列大小为10
imageReader = ImageReader.newInstance(MAX_PREVIEW_WIDTH,MAX_PREVIEW_HEIGHT, ImageFormat.JPEG,10); imageReader.setOnImageAvailableListener(reader -> { //取出最新的图片并清除队列里的旧图片
Image image = reader.acquireLatestImage();
//todo 对获取的图片进行操作 //将图片转换成Bitmap
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);//由缓冲区存入字节数组 final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); //释放资源
image.close(); },cameraHandler);//由handler去执行这里面的代码
代码的地址: https://gitee.com/chen_zhang_aw/android-camera2-test
Android:Camera2的简单使用的更多相关文章
- Android Camera2采集摄像头原始数据并手动预览
Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...
- Android Camera2拍照(一)——使用SurfaceView
原文:Android Camera2拍照(一)--使用SurfaceView Camera2 API简介 Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的a ...
- Android Camera2 拍照(二)——使用TextureView
原文:Android Camera2 拍照(二)--使用TextureView 上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面.实际上,相对于Surf ...
- android Camera2 API使用详解
原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...
- Android Camera2 拍照入门学习
原文:Android Camera2 拍照入门学习 学习资料: 肾虚将军android camera2 详解说明 极客学院android.hardware.camera2 使用指南 Android 5 ...
- Android:PopupWindow简单弹窗改进版
Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...
- Android.mk文件简单分析
Android.mk文件简单分析 一个Android.mk文件用来向编译系统描写叙述须要编译的源码.详细来说:该文件是GNUMakefile的一小部分.会被编译系统解析一次或多次. 能够在每个Andr ...
- IDA 调试 Android 方法及简单的脱壳实现
IDA 调试 Android 方法及简单的脱壳实现 标签: android原创逆向调试dalvik 2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报 分类: 原创(25) An ...
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- Android 百度地图 简单实现--- 美食搜索
Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ...
随机推荐
- Ansible自动化运维应用实战
实验环境 centos7.4 主机名称 IP 配置 用途 controlnode 172.16.1.120 1核/1G/60G ansible slavenode1 172.16.1.121 1核/1 ...
- MindSpore模型精度调优实战:如何更快定位精度问题
摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...
- Entity Framework Core中的数据迁移命令
使用程序包管理控制台输入命令. 数据迁移命令: Add-Migration 对比当前数据库和模型的差异,生成相应的代码,使数据库和模型匹配的. Remove-Migration 删除上次的迁移 Sc ...
- CF1444D Rectangular Polyline[题解]
Rectangular Polyline 题目大意 给定 \(h\) 条长度分别为 \(l_1,l_2,--,l_h\) 的水平线段以及 \(v\) 条长度分别为 \(p_1,p_2,--.p_v\) ...
- C#版Nebula客户端编译
一.需求背景 从Nebula的Github上可以发现,Nebula为以下语言提供了客户端SDK: nebula-cpp nebula-java nebula-go nebula-python nebu ...
- c语言:随机函数应用
#include <stdio.h> #include <time.h>//声明time 时间不可逆转一直在变 #include <math.h> #include ...
- adb bat
@REM 生成随机数@echo off@REM 设置延迟变量setlocal enabledelayedexpansionset min=9set max=21set /a mod=!max!-!mi ...
- 字符串的模式匹配算法——KMP模式匹配算法
朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...
- 前端开发入门到进阶第三集【sublime 的package control ——install package报错】
参考:https://www.cnblogs.com/ae6623/p/5338049.html,解决2帮我解决问题. 解决Sublime包管理package control 报错 There are ...
- linux相关的常用站点
1 http://cdimage.ubuntu.com/ ubuntu各个发行版的总集服务器 2 http://www.rpmfind.net/ 各种RPM包