当前位置: 首页 > news >正文

Android studio Camera2实现的详细流程

流程

        • 一、获取CameraManager实例
        • 二、获取可用的相机列表
        • 三、选择一个相机并打开它
        • 四、创建一个CaptureRequest.Builder对象
        • 五、设置CaptureRequest.Builder对象的参数
        • 六、创建一个CaptureSession对象
        • 七、开始预览
      • 代码示例

一、获取CameraManager实例

   CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

二、获取可用的相机列表

   String[] cameraIds = manager.getCameraIdList();

三、选择一个相机并打开它

   String cameraId = cameraIds[0];manager.openCamera(cameraId, new CameraDevice.StateCallback() {@Overridepublic void onOpened(CameraDevice camera) {// 相机已经打开,可以进行后续操作}@Overridepublic void onDisconnected(CameraDevice camera) {// 相机断开连接,需要释放资源camera.close();}@Overridepublic void onError(CameraDevice camera, int error) {// 相机打开出错,需要释放资源camera.close();}}, null);

四、创建一个CaptureRequest.Builder对象

   CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

五、设置CaptureRequest.Builder对象的参数

   builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);

六、创建一个CaptureSession对象

   camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(CameraCaptureSession session) {// CaptureSession已经创建,可以进行后续操作}@Overridepublic void onConfigureFailed(CameraCaptureSession session) {// CaptureSession创建失败,需要释放资源camera.close();}}, null);

七、开始预览

   session.setRepeatingRequest(builder.build(), null, null);

代码示例

  • xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextureViewandroid:id="@+id/texture_view"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>
  • 处理
public class MainActivity extends AppCompatActivity implements  TextureView.SurfaceTextureListener{private String[] cameraIds;private  String cameraId;private CameraManager cameraManager;//从系统服务中获取相机管理器private TextureView textureView;private CameraDevice mCameraDevice;private CameraCaptureSession cameraCaptureSession;private CaptureRequest.Builder captureRequestBuilder = null;private static final int ACTION_REQUEST_PERMISSIONS = 0x001;/*** 所需的所有权限信息*/private static final String[] NEEDED_PERMISSIONS = new String[]{Manifest.permission.CAMERA,//相机};@SuppressLint({"MissingPermission", "MissingInflatedId"})@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//权限检查if (!checkPermissions(NEEDED_PERMISSIONS)) {ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS,ACTION_REQUEST_PERMISSIONS);}textureView=findViewById(R.id.texture_view);textureView.setSurfaceTextureListener(this);//设置布局}/*** 权限检查* @param neededPermissions 需要的权限* @return 是否全部被允许*/protected boolean checkPermissions(String[] neededPermissions) {if (neededPermissions == null || neededPermissions.length == 0) {return true;}boolean allGranted = true;for (String neededPermission : neededPermissions) {allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED;}return allGranted;}@Overridepublic void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {//布局初始化完成,打开相机openCamera2();}@SuppressLint("MissingPermission")private void openCamera2(){//一、获取cameraManagercameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);try {cameraIds = cameraManager.getCameraIdList();//获取摄像机id的集合cameraId = cameraIds[0];cameraManager.openCamera(cameraId,callback,null);} catch (Exception e) {throw new RuntimeException(e);}}CameraDevice.StateCallback callback=new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull CameraDevice cameraDevice) {mCameraDevice = cameraDevice;createCameraPreviewSession();}@Overridepublic void onDisconnected(@NonNull CameraDevice cameraDevice) {}@Overridepublic void onError(@NonNull CameraDevice cameraDevice, int i) {}};private void createCameraPreviewSession() {try {SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
//            surfaceTexture.setDefaultBufferSize(textureView.getWidth(), textureView.getHeight());surfaceTexture.setDefaultBufferSize(640, 480);
//            surfaceTexture.setDefaultBufferSize(480,640 );Surface previewSurface = new Surface(surfaceTexture);captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);captureRequestBuilder.addTarget(previewSurface);mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(CameraCaptureSession session) {cameraCaptureSession = session;try {cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(CameraCaptureSession session) {Toast.makeText(MainActivity.this, "Failed to create camera capture session", Toast.LENGTH_SHORT).show();}}, null);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case ACTION_REQUEST_PERMISSIONS: {// 如果请求被取消,结果数组将为空if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 授权成功,执行相关操作} else {// 授权失败,禁用相关功能或显示提示信息}return;}// 处理其他权限请求}}@Overridepublic void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {}@Overridepublic boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {return false;}@Overridepublic void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {}@Overrideprotected void onResume() {super.onResume();}}

相关文章:

Android studio Camera2实现的详细流程

流程 一、获取CameraManager实例二、获取可用的相机列表三、选择一个相机并打开它四、创建一个CaptureRequest.Builder对象五、设置CaptureRequest.Builder对象的参数六、创建一个CaptureSession对象七、开始预览 代码示例 一、获取CameraManager实例 CameraManager manager (…...

阿里云数据库ClickHouse产品和技术解读

摘要&#xff1a;社区ClickHouse的单机引擎性能十分惊艳&#xff0c;但是部署运维ClickHouse集群&#xff0c;以及troubleshoot都不是很好上手。本次分享阿里云数据库ClickHouse产品能力和特性&#xff0c;包含同步MySQL库、ODPS库、本地盘及多盘性价比实例以及自建集群上云的迁…...

分子动力学基础知识

分子动力学基础知识 目前主要存在两种基本模型&#xff1a;其一为量子统计力学, 其二为经典统计力学。 量子统计力学 基于量子力学原理, 适用 于微观的, 小尺度, 短时 间的模拟&#xff0c;可以描述电子 的结构分布&#xff0c;原子间的成 键断键等化学性质。 经典纭计力学…...

USB转UART转串口芯片 GP232RNL国产低成本替代FT232RL/FT232RNL

近期收到很多人咨询FT232RL跟新版FT232RNL两者有什么区别&#xff0c;实际上就是内部做了一点升级&#xff0c;FT232RNL支持Windows11系统&#xff0c;参数并没有改动&#xff0c;完全可以直接替换使用。 今天小编给大家讲讲FT232RNL国产低成本替代芯片–GP232RNL GP232RNL 是…...

第03讲:SpringCloudStream实现分布式事务

需求分析 本案例是通过一个发送短信验证码的功能来实验MQ发送消息时实现分布式事务&#xff0c;思路分析如下 消息生产者生产发送验证码的半消息 生产者执行本地事务&#xff08;将验证码保存到数据库&#xff09;&#xff0c;并记录事务的ID&#xff0c;如果整个过程不出现异…...

【从零开始学Skynet】高级篇(一):Protobuf数据传输

1、什么是Protobuf Protobuf是谷歌发布的一套协议格式&#xff0c;它规定了一系列的编码和解 码方法&#xff0c;比如对于数字&#xff0c;它要求根据数字的大小选择存储空间&#xff0c;小于等于15的数字只用1个字节来表示&#xff0c;大于15的数用2个字节表示&#xff0c;以此…...

快速入门Lombok

Lombok是一个Java库&#xff0c;可以通过注解的方式来简化Java代码&#xff0c;它可以自动生成Getter、Setter、构造函数等代码&#xff0c;从而减少重复的模板代码。下面是Lombok的使用详情&#xff1a; 1. 添加Lombok依赖 在使用Lombok之前&#xff0c;我们需要先添加Lombo…...

Linux 常见命令与常见问题解决思路

Linux 常见命令 Linux 基础命令目录相关查看文件&#xff08;日志&#xff09;查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…...

用GPT-4 写2022年天津高考作文能得多少分?

正文共 792 字&#xff0c;阅读大约需要 3 分钟 学生必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 积累作文素材 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lexica …...

Django如何把SQLite数据库转换为Mysql数据库

大部分新手刚学Django开发的时候默认用的都是SQLite数据库&#xff0c;上线部署的时候&#xff0c;大多用的却是Mysql。那么我们应该如何把数据库从SQLite迁移转换成Mysql呢&#xff1f; 之前我们默认使用的是SQLite数据库&#xff0c;我们开发完成之后&#xff0c;里面有许多数…...

使用apisix代理静态文件

前言 最近公司考虑用apisix作为公司网关并且部署到k8s上&#xff0c;我这边收到一个小任务&#xff1a;使用apisix代理静态文件 通过apisix官网了解到它构建于 NGINX ngx_lua 的技术基础之上&#xff0c;所以按理应该和nginx代理静态资源是一样的。因为是通过docker容器部署…...

[元带你学NVMe协议] NVMe1.4 多路径(Multipathing)

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 全文9100字, 主要内容 目录 前言 1 多路径(Multipathing)概念...

Elasticsearch:如何使用自定义的证书安装 Elastic Stack 8.x

在我之前的文章 “如何在 Linux&#xff0c;MacOS 及 Windows 上进行安装 Elasticsearch”&#xff0c;我详细描述了如何在各个平台中安装 Elastic Stack 8.x。在其中的文章中&#xff0c;我们大多采用默认的证书来安装 Elasticsearch。在今天的文章中&#xff0c;我们用自己创…...

HADOOP--yarn ,, git

Yarn架构体系 主从架构 也是采用 master&#xff08;Resource Manager&#xff09;- slave &#xff08;Node Manager&#xff09;架构&#xff0c;Resource Manager 整个集群只有一个&#xff0c;一个可靠的节点。 1、 每个节点上可以负责该节点上的资源管理以及任务调度&am…...

IOS开发指南之UITableView控件使用

1.创建一个IOS单页应用 2.双击Main.storyboard然后拖放UITableView到视图中 3.添加TableViewCell 成功添加Table View Cell 4.修改Table View Cell属性 选中Table View Cell 在右边的Image栏输入default.png回车 到此布局设计完成,现在运行还是显示 空白,要在代码中做相关的实…...

C语言中的数据类型

目录 一、数据类型 1.基本类型 2.sizeof运算符 3.signed和unsigned 二、基本数据类型的取值范围 1.比特位 2.字节 3.符号位 4.补码 5.基本数据类型的取值范围 一、数据类型 1.基本类型 &#xff08;1&#xff09;整数类型 short intintlong intlong long int &…...

什么是微服务中的熔断器设计模式?

在本文中&#xff0c;我将解释什么是熔断器设计模式以及它解决了什么问题。 我们将仔细研究熔断器设计模式&#xff0c;并探讨如何使用Spring Cloud Netflix Hystrix在Java中实现它。到本文结束时&#xff0c;您将更好地了解如何使用熔断器设计模式提高微服务架构的弹性。 熔断…...

Ubuntu查看系统日志的几种方法

在 Ubuntu 22.10 中&#xff0c;你可以查看系统日志来排查错误。以下是几种查看日志的方法&#xff1a; 一、Journalctl 命令&#xff1a; 使用 journalctl 命令可以查看系统日志信息&#xff0c;包括引起闪退的错误信息。你可以运行以下命令来查看最新的系统日志&#xff1a;…...

【ubuntu】安装ZIP

【ubuntu】安装ZIP 输入如下命令安装zip $ sudo apt-get install zip 输出信息如下&#xff1a; Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: unzip The follo…...

DiffDock源码解析

DiffDock源码解析 数据预处理 数据输入方式 df pd.read_csv(args.protein_ligand_csv), 使用的是csv的方式输入&#xff0c; 格式&#xff1a; 不管受体还是配体&#xff0c; 输入可以是序列或者3维结构的文件 如果蛋白输入的是序列&#xff0c;需要计算蛋白的三维结构&am…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...