最新版CameraX入门(拍照、存储展示、切换前后摄像头、手电筒、闪光灯、手势伸缩、双击放大缩小)

本文详细介绍了Android CameraX库的使用,包括依赖引入、预览、拍照、手电筒、闪光灯、焦点控制等功能的实现。CameraX简化了相机功能的集成,解耦了代码,提供了更好的设备兼容性。文章还讨论了CameraX的优缺点,并给出了实际项目中如何利用CameraX替换原有兼容性代码的例子。
摘要由CSDN通过智能技术生成

在这里插入图片描述
基于官网demo,增加了对焦、手势缩放、手电、闪光灯等操作

Camera的预备知识

熟悉的大佬可以跳过

Surface、SurfaceView、SurfaceHolder这三个是啥

Surface是什么?一句话来说Surface 是一块用于填充图像数据的内存空间

可以再深入一点,了解下它包含的东西:咱后面可以重点关注下Buffer转纹理的细节实际上用openGL修改流我们下一章分析
surface本质

SurfaceView是什么?一句话来描述的话那就是:它一个可以显示surface的view!在App端它仍在View hierachy中,但在WMS中(可以理解为Server端),它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,不会影响主线程对事件的响应。缺点也很明显,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换(7.0之前)。

SurfaceHolder是什么?它是一个接口,给持有surface的对象使用,可以控制surface的大小和格式,编辑surface中的像素,以及监听surface的变化,这个接口通过SurfaceView获得。下面这张图可以说明一切

关系图

Camera介绍

在这里插入图片描述

CameraX是什么,能解决什么问题

在这里插入图片描述

  • Jetpack的一个支持库,最低版本要求Android5.0
  • 默认的相机功能还是Camera2的能力,当然API都变了,同时提供CameraX Extensions拓展库可以添加各种特效,例如人像、HDR、夜间和美颜模式(从上图也可以看出,这是依赖OEM的)
  • 绑定生命周期,所以Camera本身无需在生命周期中调用什么onPause onResume之类的样板代码,且忘记后会造成各种问题
  • 抹平设备兼容性问题,无需在代码库中添加设备专属代码

CameraX如何使用

第一步

引入依赖

    // CameraX core library
    def camerax_version = '1.0.0-rc03'
//    def camerax_version = '1.1.0-alpha03'目前最新版,但是为了稳定我们还是选择rc版
    implementation "androidx.camera:camera-core:$camerax_version"
    // CameraX Camera2 extensions[可选]拓展库可实现人像、HDR、夜间和美颜、滤镜但依赖于OEM
    implementation "androidx.camera:camera-camera2:$camerax_version"
    // CameraX Lifecycle library[可选]避免手动在生命周期释放和销毁数据
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    // CameraX View class[可选]最佳实践,最好用里面的PreviewView,它会自行判断用SurfaceView还是TextureView来实现
    implementation 'androidx.camera:camera-view:1.0.0-alpha23'
第二步

添加布局控件

<androidx.camera.view.PreviewView
	android:id="@+id/view_finder"
	android:layout_width="0dp"
	android:layout_height="0dp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent" />
第三步

初始化cameraProviderFuture并得到cameraProvider

    /** Initialize CameraX, and prepare to bind the camera use cases  */
		//UseCase实际上是一个抽象类,相机中最核心的几个类的父类ImageAnalysis/ImageCapture/Preview/VideoCapture
    private fun setUpCamera() {
   
        val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
        cameraProviderFuture.addListener(Runnable {
   
            // CameraProvider
            cameraProvider = cameraProviderFuture.get()
            // 选择默认摄像头给后续使用
            lensFacing = when {
   
                hasBackCamera() -> CameraSelector.LENS_FACING_BACK
                hasFrontCamera() -> CameraSelector.LENS_FACING_FRONT
                
  • 18
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
要使用 CameraX 在 Java 中实现切换前后置摄像头,可以通过以下步骤: 1. 获取 CameraSelector 对象:通过调用 `CameraSelector.DEFAULT_BACK_CAMERA` 或 `CameraSelector.DEFAULT_FRONT_CAMERA` 方法获取后置或前置摄像头CameraSelector 对象。 2. 关闭当前摄像头:在切换摄像头之前,需要先关闭当前正在使用的摄像头。可以通过调用 CameraProvider.unbindAll() 方法,来关闭当前的摄像头。 3. 绑定新的摄像头:使用 CameraProvider.bindToLifecycle() 方法,将新的 CameraSelector 对象绑定到生命周期中。 下面是一个简单的 Java 代码示例,可以实现切换前后置摄像头: ```java private void switchCamera() { CameraSelector cameraSelector = null; if (lensFacing == CameraSelector.LENS_FACING_BACK) { cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA; } else { cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; } CameraProvider cameraProvider = cameraProviderFuture.get(); cameraProvider.unbindAll(); Preview preview = new Preview.Builder().build(); ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build(); ImageCapture imageCapture = new ImageCapture.Builder().build(); Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview, imageAnalysis, imageCapture); preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.getCameraInfo())); lensFacing = camera.getCameraInfo().getLensFacing(); } ``` 在这个示例中,我们首先根据当前正在使用的摄像头的 LensFacing 属性,来获取要切换到的摄像头CameraSelector 对象。然后,我们通过 CameraProvider.unbindAll() 方法,关闭当前正在使用的摄像头。接着,我们使用 CameraProvider.bindToLifecycle() 方法,将新的 CameraSelector 对象绑定到生命周期中。最后,我们将 preview 设置为新摄像头的 SurfaceProvider,并更新当前正在使用的摄像头的 LensFacing 属性。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_ChuTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值