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

android CameraX构建相机拍照

Android CameraX 是一个 Jetpack 支持库,旨在简化相机应用的开发工作。它提供了一致且易用的API接口,适用于大多数Android设备,并可向后兼容至Android 5.0(API级别21)。

CameraX解决了在多种设备上实现相机功能时所遇到的兼容性问题,大大减少了需要编写的设备专属代码量。同时,它还通过提供一种基于用例的、具有生命周期感知能力的方式,简化了相机功能的开发。

导入需要的包

    implementation("androidx.camera:camera-core:1.3.4")implementation("androidx.camera:camera-camera2:1.3.4")implementation("androidx.camera:camera-lifecycle:1.3.4")implementation("androidx.camera:camera-video:1.3.4")implementation("androidx.camera:camera-view:1.3.4")

配置简单layout和PhotoActivity

新建一个activity_photo.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:xhead="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#005dd7"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:layout_margin="20dp"android:background="@drawable/shape_common_dialog_bg"android:orientation="vertical"><androidx.camera.view.PreviewViewandroid:layout_width="640dp"android:layout_height="600dp"android:id="@+id/viewFinder" /><Buttonandroid:layout_marginTop="10dp"android:background="@drawable/shape_login_button"android:id="@+id/image_capture_button"android:layout_width="300dp"android:layout_height="wrap_content"android:elevation="2dp"android:text="拍照" />
</LinearLayout>
public class PhotoActivity implements View.OnClickListener {//图片捕获private ImageCapture imageCapture;//private ProcessCameraProvider cameraProvider;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_photo);}

请求必要的权限

应用需要获得用户授权才能打开相机。
首先在AndroidManifest.xml中声明
<uses-permission android:name="android.permission.CAMERA" />
所以在onCreate(@Nullable Bundle savedInstanceState)方法中增加:

 protected void onCreate(@Nullable Bundle savedInstanceState){String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};if (allPermissionsGranted(permissions, this)) {startCamera();} else {ActivityCompat.requestPermissions(this, permissions, REQUEST_CAMERA_PERMISSION);}
}public boolean allPermissionsGranted(String[] permissions, Context context) {for (String permission : permissions) {int checkSelfPermission = ContextCompat.checkSelfPermission(context, permission);if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, permissions, REQUEST_CAMERA_PERMISSION);}}return true;}

当然用户存在不同意的情况,此时可以重写 onRequestPermissionsResult 方法以处理权限请求结果:

 @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CAMERA_PERMISSION) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已被授予,可以执行相机相关操作startCamera();} else {// 权限被拒绝,提示用户需要授权Toast.makeText(this, "需要相机权限才能使用此功能", Toast.LENGTH_SHORT).show();}}}

实现 Preview 用例,开始拍照

我们打开前置摄像头:

 private void startCamera() {ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);cameraProviderFuture.addListener(() -> {try {cameraProvider = cameraProviderFuture.get();//前置摄像头CameraSelector cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA;Preview preview = new Preview.Builder().build();// 构建预览用例preview.setSurfaceProvider(bd.viewFinder.getSurfaceProvider());// 构建图片捕获用例imageCapture = new ImageCapture.Builder().build();// 将用例绑定到相机cameraProvider.bindToLifecycle(PersonPhotoActivity.this,cameraSelector,preview,imageCapture);} catch (ExecutionException | InterruptedException e) {throw new RuntimeException(e);}}, ContextCompat.getMainExecutor(this));}
  • ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(this); 这行代码的作用是获取一个ProcessCameraProvider的实例,这个实例可以与宿主的生命周期绑定,从而无需手动管理相机的打开和关闭。
  • cameraProviderFuture注册了一个监听器,当cameraProviderFuture完成时,会执行注册的Runnable。在这个Runnable中,首先通过cameraProviderFuture.get()获取到cameraProvider实例。然后,创建一个用于预览的Preview对象,并将其Surface设置到对应的预览界面上。同时,还创建了一个ImageCapture对象用于图片捕获。
  • 使用cameraProvider.bindToLifecycle()方法将相机与当前Activity的生命周期绑定,并指定使用的摄像头、预览、以及图片捕获的配置。这样,相机就会在Activity的生命周期内自动进行资源的申请和释放

在avd虚拟机中显示

配置avd的前置摄像头为虚拟模式:
在这里插入图片描述
启动项目查看页面:
在这里插入图片描述

拍照

当拍照按钮被点击时调用takePhoto 方法,这里我们建立了一个file对象临时保存当前照片,之后我们就可以自由使用该照片:

 @Overridepublic void onClick(View view) {if (view.getId() == R.id.image_capture_button) {takePhoto(view);}}
 private void takePhoto(View view) {File file = new File(getContext().getExternalCacheDir() + File.separator + System.currentTimeMillis() + ".png");//创建包文件的数据,比如创建文件ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build();//开始拍照imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(this),new ImageCapture.OnImageSavedCallback() {@Overridepublic void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {// 关闭相机并释放资源cameraProvider.unbindAll();// file.getPath()//做业务//。。。。}@Overridepublic void onError(@NonNull ImageCaptureException exception) {Log.d(TAG, Objects.requireNonNull(exception.toString()));Toast.makeText(PersonPhotoActivity.this, "照片保存失败", Toast.LENGTH_SHORT).show();}});}

代码分析:

  1. 创建一个ImageCapture.OutputFileOptions对象,用于指定照片的输出选项,这里将照片保存到刚刚创建的File对象中。
  2. 调用imageCapture的takePicture方法开始拍照。传入outputFileOptions作为参数,以及一个回调函数OnImageSavedCallback。
  3. 在OnImageSavedCallback的onImageSaved方法中,当照片成功保存后,关闭相机并释放资源。然后可以进行其他业务操作,如显示照片等。

相关文章:

android CameraX构建相机拍照

Android CameraX 是一个 Jetpack 支持库&#xff0c;旨在简化相机应用的开发工作。它提供了一致且易用的API接口&#xff0c;适用于大多数Android设备&#xff0c;并可向后兼容至Android 5.0&#xff08;API级别21&#xff09;。 CameraX解决了在多种设备上实现相机功能时所遇…...

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示 proteus仿真+程序+设计报告+讲解视频

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计 ( proteus仿真…...

工厂水电燃气表流量计等能耗计量仪表非侵入式拍照抄表的方案

在企业园区、工厂等企事业单位&#xff0c;传统的手动抄表方式已逐渐不能满足现代化、信息化管理的需求。为了提高抄表工作的效率&#xff0c;减少人工操作的误差&#xff0c;同时保障数据的安全性和实时性&#xff0c;我们提出了拍照采集抄表方案。本方案旨在通过拍照的方式&a…...

LLM大模型应用中的安全对齐的简单理解

LLM大模型应用中的安全对齐的简单理解 随着人工智能技术的不断发展&#xff0c;大规模语言模型&#xff08;如GPT-4&#xff09;的应用越来越广泛。为了保证这些大模型在实际应用中的性能和安全性&#xff0c;安全对齐&#xff08;Safe Alignment&#xff09;成为一个重要的概…...

clickhouse-jdbc-bridge rce

clickhouse-jdbc-bridge 是什么 JDBC bridge for ClickHouse. It acts as a stateless proxy passing queries from ClickHouse to external datasources. With this extension, you can run distributed query on ClickHouse across multiple datasources in real time, whic…...

java中Comparator函数的用法实例?

在Java中&#xff0c;Comparator接口用于比较两个对象的顺序&#xff0c;常用于集合的排序。自Java 8开始&#xff0c;Comparator接口得到了增强&#xff0c;提供了许多默认方法&#xff0c;使得排序逻辑更加灵活和强大。下面将通过几个实例来展示Comparator的用法。 示例1&am…...

mysql实战入门-基础篇

目录 1、MySQL概述 1.1、数据库相关概念 1.2、MySQL数据库 1.2.1、版本 1.2.2、下载 1.2.3、安装 输入MySQL中root用户的密码,一定记得记住该密码 1.2.4、启动停止 1.2.5、客户端连接 1.2.6、数据模型 2、SQL 2.1、SQL通用语法 2.2、SQL分类 2.3、DDL 2.3.1、数据…...

阶段三:项目开发---民航功能模块实现:任务24:航空实时监控

任务描述 内 容&#xff1a;地图展示、飞机飞行轨迹、扇区控制。航空实时监控&#xff0c;是飞机每秒发送坐标&#xff0c;经过终端转换实时发送给塔台&#xff0c;为了飞机位置的精准度&#xff0c;传输位置的密度很大&#xff0c;在地图位置显示不明显。本次为了案例展示效…...

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux&#xff08;Termux扩展&#xff09; 1.1 切换源 注&#xff1a;可以将termux进行换源&#xff0c;最好采用国内源&#xff0c;例如&#xff1a;清华源等 更新包列表和升级包&#xff08;可选&#xff0…...

科普文:深入理解Mybatis

概叙 (1) JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 优点…...

称重传感器有哪些种类

有关称重传感器的知识&#xff0c;称重传感器是众多传感器产品中的一种&#xff0c;也是很常用的传感器之一&#xff0c;那么称重传感器有哪些种类&#xff0c;称重传感器的分类方式是什么样的&#xff0c;一起来了解下。 称重传感器的分类 主要有六种称重传感器类型&#xf…...

程序员鱼皮的保姆级写简历指南第四弹,优秀简历参考

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…...

UML建模案例分析-时序图和类图的对应关系

概念 简单地说&#xff0c;类图定义了系统中的对象&#xff0c;时序图定义了对象之间的交互。 例子 一个电子商务系统&#xff0c;会员可通过电子商务系统购买零件。具体功能需求如下&#xff1a; 会员请求结账时&#xff0c;系统验证会员的账户是否处于登录状态&#xff1…...

Java版Flink使用指南——从RabbitMQ中队列中接入消息流

大纲 创建RabbitMQ队列新建工程新增依赖编码设置数据源配置读取、处理数据完整代码 打包、上传和运行任务测试 工程代码 在《Java版Flink使用指南——安装Flink和使用IntelliJ制作任务包》一文中&#xff0c;我们完成了第一个小型Demo的编写。例子中的数据是代码预先指定的。而…...

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…...

Linux 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率

【Linux】 高级 Shell 脚本编程&#xff1a;掌握 Shell 脚本精髓&#xff0c;提升工作效率 Shell 脚本编程是 Linux 系统管理员和开发人员的必备技能。通过学习高级 Shell 脚本编程&#xff0c;你可以编写更高效、更灵活和更易于维护的脚本。本文将介绍 Shell 脚本编程中的函数…...

【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Enabling the distribution of interruptsGIC Distributor 中断组分发控制CPU Interface 中断组分发控制Physical LPIs 的启用Summary Enabling the distribution of interrupts 在ARM GICv3和GICv4体系结构中&#xff0c;中断分发…...

《mysql篇》--索引事务

索引 索引的介绍 索引是帮助MySQL高效获取数据的数据结构&#xff0c;是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针&#xff0c;因为索引本身也比较大&#xff0c;所以索引一般是存储在磁盘上的&#xff0c;索引的种类有很多&#xff0c;不过如果没有特殊…...

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…...

运维团队如何应对动环监控与IT监控分离的挑战

IT与机房动环监控的一体化是当下及未来的必然趋势&#xff0c;这一模式显著节省了运维过程中的时间与成本。一体化平台不仅消除了频繁切换系统的繁琐&#xff0c;更在一个统一界面上实现了多元化的管理运维功能&#xff0c;极大地提升了工作效率。 在机房升级或新建项目中&…...

《B3845 [GESP样题 二级] 勾股数》

题目背景 对应的选择、判断题&#xff1a;https://ti.luogu.com.cn/problemset/1102 题目描述 勾股数是很有趣的数学概念。如果三个正整数 a,b,c&#xff0c;满足 a2b2c2&#xff0c;而且 1≤a≤b≤c&#xff0c;我们就将 a,b,c 组成的三元组 (a,b,c) 称为勾股数。你能通过编…...

从rdt1.0到rdt3.0:可靠数据传输协议的演进与发送接收端FSM解析

1. 可靠数据传输协议的前世今生 第一次接触可靠数据传输协议&#xff08;Reliable Data Transfer&#xff0c;简称rdt&#xff09;是在十多年前的一个网络编程项目里。当时为了确保数据能准确无误地传输&#xff0c;我翻遍了各种资料&#xff0c;最终在《计算机网络&#xff1a…...

Real-ESRGAN-GUI:如何用AI双引擎将模糊图片一键变高清

Real-ESRGAN-GUI&#xff1a;如何用AI双引擎将模糊图片一键变高清 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 还在为模糊的老照片、低分辨率的动漫图片而烦恼吗&…...

IO-Link物理层深度解析:编码机制与接口设计实战

1. IO-Link物理层编码机制详解 第一次接触IO-Link的开发者往往会被它的11bit编码规则绕晕。我刚开始调试STM32的IO-Link主站时&#xff0c;就因为在UART配置上少勾选了一个校验位&#xff0c;导致从站设备死活不响应。后来用逻辑分析仪抓包才发现&#xff0c;原来发送的0xF1在…...

告别重复劳动:用快马生成deerflow式工作流,提升开发效率十倍

最近在尝试优化日常开发流程时&#xff0c;发现很多重复性的代码检查工作特别耗时。于是研究了下如何用InsCode(快马)平台快速搭建一个deerflow风格的自动化工具&#xff0c;效果出乎意料的好。这里分享下具体实现思路和体验。 为什么需要自动化工作流 每次提交代码前&#x…...

08_Claude Code之高级工作流与自动化:循环、调度与并行批处理

08 Claude Code之高级工作流与自动化&#xff1a;循环、调度与并行批处理 Claude Code 的真正价值在于自动化能力&#xff0c;而不仅仅是对话工具。本文深度讲解 Plan Mode 的量化对比&#xff08;多文件重构成功率从62%到89%&#xff09;、非交互批处理脚本、并行处理架构、CI…...

SPM12实战:手把手教你搞定fMRI数据预处理(从时间矫正到空间平滑)

SPM12实战&#xff1a;零基础入门fMRI数据预处理全流程解析 第一次接触功能磁共振成像&#xff08;fMRI&#xff09;数据分析时&#xff0c;面对SPM12复杂的界面和晦涩的术语&#xff0c;很多新手都会感到无从下手。这篇文章将带你从零开始&#xff0c;用最直观的方式掌握fMRI数…...

[特殊字符] GLM-4V-9B企业级方案:客户上传截图问题自动诊断

GLM-4V-9B企业级方案&#xff1a;客户上传截图问题自动诊断 1. 引言 想象一下这个场景&#xff1a;你是一家SaaS公司的技术支持工程师&#xff0c;每天的工作就是处理海量的客户工单。其中&#xff0c;有相当一部分问题描述是模糊的&#xff0c;比如“我的页面显示不正常”、…...

牙齿龋齿检测数据集 YOLO模型如何训练牙齿病害数据集 权重识别龋齿

牙齿龋齿检测数据集&#xff0c;2554张&#xff0c;提供yolo和voc两种标注方式 1类&#xff0c;标注数量&#xff1a; caries: 6946 image num: 2554 &#x1f9b7; 龋齿检测数据集 (Dental Caries Detection Dataset) 属性详细描述数据集名称齿科龋齿目标检测数据集图像总数2…...

Plumbum管道与重定向完全教程:构建复杂Shell命令链

Plumbum管道与重定向完全教程&#xff1a;构建复杂Shell命令链 【免费下载链接】plumbum Plumbum: Shell Combinators 项目地址: https://gitcode.com/gh_mirrors/pl/plumbum Plumbum是一个强大的Python库&#xff0c;它让您在Python中编写shell脚本般简洁的代码&#x…...