探索 Android 平台的 CameraX

2024-01-01 18:32
文章标签 android 平台 探索 camerax

本文主要是介绍探索 Android 平台的 CameraX,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 
640?wx_fmt=png

这篇文章发布于 joebirch.co

https://joebirch.co/2019/05/15/exploring-camerax-on-android-camera-view/

如果你曾经用过 Android 的 Camera APIs,你可能已经感受到了,它们一直没有成为最容易实现的东西。最开始是 Camera API,然后又推荐使用 Camera2 API — 这个升级是为了让开发者在使用 Android 的相机 API 时有更好的体验。然而,使用相机的 API (即使是最简单的使用)时还是会有很多脏代码,而且,在 Android 应用中要实现 Camera 功能时还是会很困难。

幸运的是,新的 CameraX API 给相机功能开发提供了更简单的解决方案以帮助我们减轻这些痛苦。另外,CameraX 基于 Camera2 API 实现,它极大地简化了在 minSdk 21 及以上版本的实现过程。这篇文章将会研究 CameraX API 的第一部分,了解 Camera API 是什么以及我们如何在 App 中开始使用它。

配置 CameraX

CameraX 由两个概念来完成实现 -- Camera View 和 Camera Core。Camera View 可被单独用于处理基本的相机要求,比如拍照,录视频,生命周期管理以及相机切换等。而核心库能够搭配 Camera View 处理更复杂的 CameraX 实现(比如在当前的相机上下文提供一个取景器)。我们将会在这篇文章中看看 CameraView 组件是怎么工作的。

开始使用 CameraX 之前,我们需要一些配置步骤。放心,从添加权限到在你的 app 里有一个简单的 camera 实现,不会有很多步骤(甚至也不会有很多代码)。

640?wx_fmt=png

首先在应用的 manifest 添加 Camera 权限:
<uses-permission android:name="android.permission.CAMERA" />

然后,需要添加必要的依赖:

def camerax_version = "1.0.0-alpha01"// 添加 CameraX core “androidx.camera:camera-core:${camerax_version}”// 添加 CameraX Camera2 API 互操作支持implementation “androidx.camera:camera-camera2:${camerax_version}”"1.0.0-alpha01"
// 添加 CameraX core 
“androidx.camera:camera-core:${camerax_version}
// 添加 CameraX Camera2 API 互操作支持
implementation “androidx.camera:camera-camera2:${camerax_version}

注意:CamaraView 现在还不可用,但你可以在这里看源码。因为这个原因,实现的细节未来可能会有变化。

你可能注意到了,这里有两个不同的依赖:

有了上面的准备工作,我们现在可以看看如何在我们的应用里实现 Camera view 组件了。

Camera View

正如上文所说,CameraView 给开发者提供了方法,使他们不需要太多困难就可以在 app 里提供基础的 camear 实现。我们能够在布局文件里直接添加这个组件:

<androidx.camera.view.CameraView    android:id="@+id/view_camera"    android:layout_width="match_parent"    android:layout_height="match_parent" />

这个 CameraView 类是一个 ViewGroup,本质上包含了一个 TextureView 来显示 camera 流,以及配置这个组件的一些属性。

640?wx_fmt=png

这些 xml 属性既可以在布局文件里设置,也可以在代码里设置。所以,如果你想提供 UI 控件控制上面这些属性 ,你可以使用 ClickListener 来设置这些属性。

既然我们是在 Activity 里布局的 CameraView,我们可以用 CameraView 的 bindToLifeCycle 方法将这个 View 与当前组件的生命周期绑定。

class MainActivity : AppCompatActivity() {     override fun onCreate(savedInstanceState: Bundle?) {         ...        view_camera.bindToLifecycle(this)     }}
    override fun onCreate(savedInstanceState: Bundle?) { 
        ...
        view_camera.bindToLifecycle(this
    }
}

前面所说的已经配置并且添加到我们的工程了,现在我们在 app 里有了一个准备好了的简单的 CameraView 来捕获媒体。需要说明的是,CameraView 不能被单独扩展来提供更多的功能。CameraView 的目标是提供一个简化的可以方便地以 View 的形式使用的相机实现。如果你想要实现更多的功能,你需要使用 CameraX Core 库,我们将在另一篇文章里聊到它。

如果你已经完成了上面的配置,那你应该能够打开相机并且在屏幕上看到预览了。CameraView 提供了一些当用户操作 UI 时我们可以触发的方法。

当要使用拍照功能时,takePicture 方法可以从相机捕获图片。这里我们需要提供一个图片数据保存位置的文件引用,以及一个在图片成功保存或者出现错误时使用的 Listener。

camera_view.takePicture(File("some_file_path"),    object : ImageCaptureUseCase.OnImageSavedListener {        override fun onImageSaved(file: File) {            // 处理被保存的图片        }        override fun onError(            error: ImageCaptureUseCase.UseCaseError,            message: String,            throwable: Throwable?        ) {            // 处理错误        }    })
    object : ImageCaptureUseCase.OnImageSavedListener {
        override fun onImageSaved(file: File) {
            // 处理被保存的图片
        }
        override fun onError(
            error: ImageCaptureUseCase.UseCaseError,
            message: String,
            throwable: Throwable?
        )
 {
            // 处理错误
        }
    })

当拍摄视频出现错误是,ImageCaptureUseCase.UseCaseError 将会给我们返回以下的某一错误状态:

takePicture 还有另一种形式,这种形式只使用一个 OnImageCaptureListener 回调参数。这个回调用来监听图片被捕捉(或者出现了错误),然后开发者可以根据情况处理结果数据。前面的 takePicture 使用更简单,但这个 takePicture 提供了更多的灵活性。

camera_view.takePicture(object :         ImageCaptureUseCase.OnImageCapturedListener() {        override fun onCaptureSuccess(            image: ImageProxy,             rotationDegrees: Int        ) {            // 处理捕捉的图片        }        override fun onError(            useCaseError: ImageCaptureUseCase.UseCaseError?,             message: String?,             cause: Throwable?        ) {            // 处理图片捕获错误        }    })
    ImageCaptureUseCase.OnImageCapturedListener() {
        override fun onCaptureSuccess(
            image: ImageProxy
            rotationDegrees: Int
        )
 {
            // 处理捕捉的图片
        }
        override fun onError(
            useCaseError: ImageCaptureUseCase.UseCaseError?, 
            message: String?, 
            cause: Throwable?
        )
 {
            // 处理图片捕获错误
        }
    })

我们可能也想使用 CameraView 来录视频。这时候我们需要使用 startRecoring() 方法—只需要传递一个用来保存结果的文件引用,以及一个  来处理操作结果(成果或者失败)的 listener

camera_view.startRecording(File("some_file_path"),    object : VideoCaptureUseCase.OnVideoSavedListener {        override fun onVideoSaved(file: File?) {            // Handle video saved        }        override fun onError(            error: VideoCaptureUseCase.UseCaseError?,             message: String?,             throwable: Throwable?        ) {            // Handle video error        }    })
    object : VideoCaptureUseCase.OnVideoSavedListener {
        override fun onVideoSaved(file: File?) {
            // Handle video saved
        }
        override fun onError(
            error: VideoCaptureUseCase.UseCaseError?, 
            message: String?, 
            throwable: Throwable?
        )
 {
            // Handle video error
        }
    })

这里你可以看到,onVideSaved 方法给我们返回一个被保存的视频数据的文件实例。我们也有 onError 方法用来处理错误状态,在我们的 UI 上根据情况 作出对应的反馈。当拍摄视频导致错误时,VideoCaptureUseCase.UseCaseError 将会返回下面错误状态中的某一个:

当用户希望停止拍摄视频时,我们只需要调用 stopRecording 方法让用例 知道我们希望停止拍摄视频:

camera_view.stopRecording().stopRecording()

最后,当我们使用 CameraView 完毕后,我们必须确保解绑相机,释放被用到的资源:

override fun onDestroyView() {    super.onDestroyView()    CameraX.unbindAll()}fun onDestroyView() {
    super.onDestroyView()
    CameraX.unbindAll()
}

这篇文章我们了解了 CameraX 库以及 CameraView,学习如何使用以及使用它能够做什么。在安卓程序中实现相机功能,尤其是不需要使用高级的功能,这是一个很大的进步。你将会使用 CameraView 吗?如果你有任何想分享的想法或者问题,请一定要分享出来!

我的下一篇文章将会写在 CameraX Core library 中发现的用例,请关注我,这样在文章发布时你能看到。


本文翻译自:
https://joebirch.co/2019/05/15/exploring-camerax-on-android-camera-view/

如有侵权,请联系本号删除。



推荐阅读
Kotlin:你必须要知道的 inline-noinline-crossinline
Flutter日历,可以自定义风格UI



编程·思维·职场
欢迎扫码关注

640?wx_fmt=jpeg


  在看也是一种认可640?wx_fmt=gif

这篇关于探索 Android 平台的 CameraX的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560137

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存