Android经典实战之简化 Android 相机开发:CameraX 库的全面解析

news2024/11/27 4:37:40

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

CameraX 是 Android Jetpack 的一个组件库,旨在简化 Android 相机应用的开发。它提供了一系列易于使用的 API,支持从 Android 5.0(API 级别 21)起的设备,具有广泛的设备兼容性和生命周期感知能力 。

CameraX 的主要特点包括:

  • 设备兼容性:CameraX 支持 98% 以上的现有 Android 设备,解决了设备兼容性问题。
  • 易用性:提供简洁的 API,简化了相机的打开、预览、拍照和录制等操作。
  • 生命周期感知:自动处理相机操作的生命周期,根据应用状态做出相应调整。
  • 简化实现:减少添加相机功能时需要编写的代码量,快速实现拍照、视频录制、实时预览等功能。
  • 集成与测试:提供易于集成的 API 和测试工具,帮助开发者进行充分测试 。

使用 CameraX 的基本步骤:

  1. 添加依赖:在项目的 build.gradle 文件中添加 CameraX 相关依赖。
  2. 初始化 CameraX:在 Activity 或 Fragment 中初始化 CameraX,通常通过获取 ProcessCameraProvider 实例。
  3. 配置 Preview:使用 PreviewView 显示相机预览,并配置 Preview 对象。
  4. 绑定用例:将配置好的用例(如 PreviewImageCaptureVideoCapture)绑定到生命周期。
  5. 实现功能:根据需要实现拍照、视频录制或图像分析等功能。

代码示例:

以下是使用 CameraX 实现拍照功能的示例代码:

// 获取 ProcessCameraProvider 实例
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

// 定义所需的权限
val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)

// 检查权限
if (allPermissionsGranted(REQUIRED_PERMISSIONS)) {
    startCamera()
} else {
    ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
}

private fun startCamera() {
    try {
        // 获取 CameraProvider 实例
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        // 绑定 Preview 和 ImageCapture 用例
        val preview = Preview.Builder().build().also {
            it.setSurfaceProvider(viewBinding.viewFinder.surfaceProvider)
        }
        imageCapture = ImageCapture.Builder().build()

        // 选择后摄像头
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        // 绑定生命周期
        cameraProvider.bindToLifecycle(
            this, cameraSelector, preview, imageCapture
        )
    } catch (exc: Exception) {
        Log.e(TAG, "Use case binding failed", exc)
    }
}

private fun takePhoto() {
    // 拍照逻辑
    imageCapture?.takePicture(
        ContextCompat.getMainExecutor(this),
        object : ImageCapture.OnImageSavedCallback {
            override fun onImageSaved(output: ImageCapture.OutputFileResults) {
                val savedUri = output.savedUri
                // 处理拍照成功的逻辑
            }
            override fun onError(error: ImageCaptureException) {
                // 处理拍照失败的逻辑
            }
        }
    )
}

在上述代码中,startCamera 函数用于初始化相机并绑定预览和拍照用例,takePhoto 函数用于执行拍照操作,并处理拍照成功或失败的回调 。

最佳实践:

  • 确保在应用的最低 API 级别为 21 或更高版本的设备上使用 CameraX。
  • 在 AndroidManifest.xml 中添加必要的权限声明。
  • 使用 ActivityCompatContextCompat 处理运行时权限请求。
  • onDestroy 方法中释放 CameraX 相关资源,如关闭 ExecutorService
  • 考虑使用 ViewBinding 来绑定布局,提高代码的可读性和安全性 。

通过遵循上述步骤和最佳实践,您可以高效地使用 CameraX 开发功能丰富且稳定的相机应用。


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别怕!PMP考试难度全解析,助你一次过!

首先我得说,PMP考试,它难,也不是那么难。为啥这么说呢? 你看,PMP考试难,难在哪儿?就难在它那知识面太广了,就像个杂货铺,啥都得懂点儿。项目管理啊,得懂管理&…

【Hot100】LeetCode—543. 二叉树的直径

目录 1- 思路深搜——dfs 2- 实现⭐543. 二叉树的直径——题解思路 3- ACM 实现 原题连接:543. 二叉树的直径 1- 思路 深搜——dfs 递归三部曲 1- 递归参数和返回值 返回 public int depth(TreeNode root) 2- 终止条件 如果遇到 null,则返回 0 3- 递…

2024Go语言面试宝典Golang零基础实战项目面试八股力扣算法笔记等

2024最新Golang面试八股文,以及各种零基础全套实战项目,经典力扣算法题以及常见的面试题型,大厂面试题。go语言面试必备。包括GO基础类、GO并发编程、GO RUNTIME、微服务、容器技术、Redis、MySQL、Linux、缓存、网络和操作系统、消息队列、分…

USB3.2 摘录(六)

系列文章目录 USB3.2 摘录(一) USB3.2 摘录(二) USB3.2 摘录(三) USB3.2 摘录(四) USB3.2 摘录(五) USB3.2 摘录(六) 文章目录 系列文…

如何在VMwareWorkstation上安装的ESXi系统扩容存储

在做ESXi的相关实验的时候,需要扩容ESXi的存储,那么如何进行操作呢? 扩容VMwareWorkstation上虚拟机的存储 首先我们需要先扩容虚拟机上的存储(可不关闭虚拟机)按照图下所示,右键虚拟机,点击设…

PCL-基于RANSAC的平面拟合方法

基于RANSAC的平面拟合方法 一、简介二、实验代码三、实验结果 一、简介 随机采样一致性(Random sample consensus,RANSAC):RANSAC是一种鲁棒的模型拟合方法,它可以处理存在大量噪声和异常值的数据。在进行平面拟合时&…

Qt QTableWidgetItem.setFlags()

查看 Qt 官方地址 Qt Namespace | Qt Core 5.15.14 得到如下说明 默认值是 63,即如下表达式的值(位运算),表示可选择(1)、可编辑(2)、可拖拽(4)、可放入&…

Springboot查看版本和兼容的依賴

https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#appendix-dependency-versions 如果需要查自己的版本,只需要修改2.7.18,因爲我的是2.7.18的版本。 然後如果你想查詢所兼容的其它依賴版本,可以打開頁面后直接search…

RK3588——网口实时传输视频

由于通过流媒体服务器传输画面延迟太高的问题,不知道是没有调试到合适的参数还是其他什么问题。诞生了这篇博客。 RK3588板端上接摄像头,采集画面,通过网口实时传输给上位机并显示。 第一代版本 RK3588代码 import cv2 import socket imp…

AI智能体:我用扣子给詹杜库做了一套超酷炫的手办

杀疯了! 在巴黎奥运会今日的男篮决赛中,库里开启了杀神模式。 末节关键时刻投中 4 记三分,直接带走比赛,看得我都跪了。 库里在 2012 年未能入选梦之队,2016 年 NBA 季后赛夺冠后太过疲惫,2021 年东京奥…

真实护网,看这一篇就够了!【护网行动】

如果一个白帽黑客没参过护网,那他可能要回炉重造了。那么网安领域最出名的护网是什么?12年攻防老手告诉你答案。 1.什么是护网? 护网行动是由机关单位主办的网络攻防比赛,一般是每年的6~9月份会举行,分为国家级、省级…

如何给两台机器集群设置VIP(虚拟IP)

原文链接:https://www.cnblogs.com/qianz/articles/16825567.html 一、环境准备 1.集群 IP部署 172.16.30.181是主节点,172.16.30.182是备节点,VIP是172.16.30.183 我是在openstack上搭建的集群,建议大家将需要用到的IP都固定到…

java多线程(五)线程间通信

线程间通信是并发编程中的一个重要概念,它允许多个线程之间交换信息或共享数据。 以下是几种常见的线程间通信方式及其示例: 1. 共享内存 共享内存是最基本的线程间通信方式。多个线程可以访问同一块内存区域,通过读写这块内存区域来实现数…

【问题解决】 PyAutoGUI was unable to import pyscreeze.

解决方案: 打开终端(winr 输入cmd回车)执行 pip install pyscreeze 再执行:pip install pillow

详解并掌握AXI4总线协议(四)、AXI4_FULL_SLAVE接口源码分析以及仿真验证

系列文章目录 详解并掌握AXI4总线协议(一)、AXI4-FULL接口介绍 详解并掌握AXI4总线协议(二)、AXI4_FULL_MASTER接口源码分析以及仿真验证 详解并掌握AXI4总线协议(三)、基于AXI4_FULL接口的BRAM读写仿真验…

免费好用!阿里这5款AI神器,太强了,打工人必备!(建议收藏)

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 《黑神话:悟空》太爆了!最近感觉都要被…

Eclipse部署一个项目到Tomcat和部署多个项目到Tomcat

Eclipse部署一个项目到Tomcat: https://blog.csdn.net/weixin_42334396/article/details/105902994 Eclipse部署多个项目到Tomcat: https://blog.csdn.net/zhanglin1220/article/details/82056185 使用cmd方法强制关闭端口,解除端口占用方法&…

2.初识springcloud

文章目录 1.什么是SpringCloud1.1版本的介绍 2.Spring Cloud实现方案3.环境搭建4.服务拆分原则5.数据准备5.1订单服务5.2商品服务 大家好,我是晓星航。今天为大家带来的是 初识springcloud 相关的讲解!😀 1.什么是SpringCloud 简单来说&…

Excel表格添加趋势线_数据拟合

一个曲线通过补偿算法拟合为另一个曲线,通常可以通过多种数学和计算技术实现。这里也可以通过Excel表格添加趋势线,然后对趋势线进行拟合,得到趋势预测公式来达到数据补偿。 通过把你需要的数据导入到Excel表格中。 通过 “ 插入 ” --> “…

从单一到互联:KNX网关如何改变你的家居生活

从单一到互联:KNX网关如何改变你的家居生活 在科技日新月异的今天,家居生活正经历着一场前所未有的变革。从过去单一、孤立的设备操作,到如今智能、互联的生态系统,KNX网关作为这一转变的关键角色,正悄然改变着我们的日…