Android Camera开发入门(3):CameraX的使用

这篇具有很好参考价值的文章主要介绍了Android Camera开发入门(3):CameraX的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Camera开发入门(3):CameraX的使用

CameraX API简介

在前两篇博客中,我们介绍了Camera基础知识和Camera2 API的使用。为了进一步简化相机应用开发,Google推出了CameraX API,它提供了一个更加简洁、易于使用的接口,帮助开发者快速实现高质量的相机功能。本篇博客将带领你了解CameraX的使用方法,并提供相应的示例代码。

准备工作:

在开始之前,确保你的开发环境已经配置好,Android Studio已更新到最新版本。

依赖添加:

为了使用CameraX API,我们需要在项目的build.gradle文件中添加以下依赖库:

dependencies {
    def camerax_version = "1.0.1"

    // CameraX核心库
    implementation "androidx.camera:camera-core:$camerax_version"
    // CameraX视图库
    implementation "androidx.camera:camera-camera2:$camerax_version"
    // CameraX生命周期库
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    // CameraX扩展库,用于支持预览和分析
    implementation "androidx.camera:camera-view:1.0.0-alpha28"
}

初始化CameraX:

首先,我们需要在Activity或Fragment中初始化CameraX。以下是一个示例:

private lateinit var cameraProvider: ProcessCameraProvider
    private lateinit var preview: Preview

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        cameraProviderFuture.addListener({
            cameraProvider = cameraProviderFuture.get()

            bindCameraUseCases()
        }, ContextCompat.getMainExecutor(this))
    }

    @SuppressLint("RestrictedApi")
    private fun bindCameraUseCases() {
        val cameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_FRONT)
            .build()

        //previewView预览
        preview = Preview.Builder().build()
        //拍照
        imageCapture = ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            .build()
        //录像
        videoCapture = VideoCapture.Builder()//录像用例配置
            .setTargetAspectRatio(AspectRatio.RATIO_16_9) //设置高宽比
            .setTargetRotation(ROTATION_90)//设置旋转角度
            .setAudioRecordSource(MediaRecorder.AudioSource.MIC)//设置音频源麦克风
            .build()

        //解绑用例
        cameraProvider.unbindAll()
        //绑定用例
        cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, videoCapture)

        //开始预览 previewView
        preview.setSurfaceProvider(binding!!.previewView.surfaceProvider)
    }

在上述代码中,我们通过调用ProcessCameraProvider.getInstance()来获取CameraX的实例。然后,我们使用bindToLifecycle()方法绑定相机的生命周期,并指定预览用例。

设置预览:

为了在界面上显示相机预览,我们需要在布局文件中添加一个PreviewView元素。以下是一个示例布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".CameraXActivity">

    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/camerax_takePicture"
        android:text="开始拍照"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <Button
        android:id="@+id/camerax_recording"
        android:text="开启录制"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toTopOf="@+id/camerax_takePicture"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

在Activity或Fragment中,我们将使用PreviewView显示相机预览。在上面的示例代码中,我们通过previewView.createSurfaceProvider()方法将预览与相机绑定起来。

通过上述步骤,我们已经成功实现了使用CameraX显示相机预览的功能。你可以尝试运行应用程序,在设备上查看相机预览的效果。

拍照

CameraX不论拍照还是录制都比Camera和Camera2简单,只要绑定了相关用例,后续直接调用即可;

 	binding!!.cameraxTakePicture.setOnClickListener {
            takePicture()
    }
	 //拍照
    private var imageCapture: ImageCapture? = null
    private fun takePicture() {
        val outputFile = File(this.getExternalFilesDir(null), "${System.currentTimeMillis()}.jpg")
        Log.e(TAG, "照片文件: ${outputFile.absolutePath}")
        val outputOptions = ImageCapture.OutputFileOptions.Builder(outputFile).build()
        imageCapture?.takePicture(
            outputOptions,
            ContextCompat.getMainExecutor(this),
            object : ImageCapture.OnImageSavedCallback {
                override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                    // 图片保存成功后的处理逻辑
                    Toast.makeText(this@CameraXActivity, "拍照成功", Toast.LENGTH_SHORT).show()
                }

                override fun onError(exception: ImageCaptureException) {
                    // 拍照失败的处理逻辑
                    Toast.makeText(this@CameraXActivity, "拍照失败", Toast.LENGTH_SHORT).show()
                }
            })
    }

录像

和拍照类似,CameraX更像是一个封装好的第三方依赖,只要了解具体用法,相对于前两者,使用起来都更加简单明了;

	binding!!.cameraxRecording.setOnClickListener {
            if (!isRecording) startRecording() else stopRecording()
    }
	//录像
    private var isRecording = false
    private var videoCapture: VideoCapture? = null
    private fun startRecording() {
        val outputFile = File(this.getExternalFilesDir(null), "${System.currentTimeMillis()}.mp4")
        Log.e(TAG, "视频文件: ${outputFile.absolutePath}")
        val outputOptions = VideoCapture.OutputFileOptions.Builder(outputFile).build()
        videoCapture?.startRecording(
            outputOptions,
            ContextCompat.getMainExecutor(this),
            object : VideoCapture.OnVideoSavedCallback {
                override fun onVideoSaved(outputFileResults: VideoCapture.OutputFileResults) {
                    // 录制保存成功后的处理逻辑
                    Toast.makeText(this@CameraXActivity, "录制保存成功", Toast.LENGTH_SHORT).show()
                    isRecording = false
                }

                override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) {
                    // 录制保存失败的处理逻辑
                    Toast.makeText(this@CameraXActivity, "录制保存失败", Toast.LENGTH_SHORT).show()
                    isRecording = false
                }
            })
        isRecording = true
    }

    private fun stopRecording() {
        videoCapture?.stopRecording()
        isRecording = false
    }

结论:

通过本篇博客,我们了解了CameraX API的基本使用方法,并实现了显示相机预览的功能。CameraX提供了更加简单、易于使用的接口,简化了相机应用的开发流程,使我们能够更加专注于核心功能的实现。在下一篇博客中,我们将深入介绍CameraX API的更多功能,如拍照、录制视频、图像分析等。

参考链接

CameraX官方文档
CameraX官方文档提供了CameraX API的详细说明,包括核心概念、基本用法、高级特性等内容。

CameraX示例代码
Google官方提供的CameraX示例代码,展示了CameraX API的使用方法和最佳实践,你可以从中学习和参考。

CameraX开发者指南
Google官方提供的Codelab,逐步引导你了解和使用CameraX API,通过实践来掌握CameraX的常用功能。

CameraX扩展库
CameraX扩展库提供了一组专门针对预览、图像分析和视频录制的功能扩展,帮助你更便捷地实现常见相机功能。

DEMO


该系列文章到这里也就算结束了,后续我将考虑推出更多关于不同版本之间如何添加水印、滤镜以及视频编码等相关功能的简介文章。期待与您分享更多有关相机功能的内容!如果您还有其他问题或需求,请随时告诉我们。谢谢!

gitee:https://gitee.com/yunianvh/camera-demo
github:https://github.com/yunianvh/CameraDemo

编辑:玉念聿辉
感谢查阅文章来源地址https://www.toymoban.com/news/detail-679529.html

到了这里,关于Android Camera开发入门(3):CameraX的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android多媒体功能开发(12)——使用Camera类拍照

    Android上用摄像头拍照、录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.camera2包。目前这两套API都可以使用,Camera类用起来比较简单易懂,但功能少灵活性差,所以现在降级使用;Camera2框架功能强大,对摄像头的控制灵活,但由于

    2023年04月13日
    浏览(32)
  • 【Android】使用 CameraX 实现基础录像功能

    目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 6. 项目完整代码 JDK:JDK17 Android Studio:Android Studio Giraffe | 2022.3.1 Android SDK:Android API 34 Gradle: gradle-8.0-bin.zip CameraX Version: 1.1.0-alpha05 在 build.gradle 中添加 CameraX 的相关依赖 在 AndroidManifest.xml 文件中

    2024年02月14日
    浏览(28)
  • 【Android】使用 CameraX 实现基础拍照功能

    目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 6. 项目完整代码 JDK:JDK17 Android Studio:Android Studio Giraffe | 2022.3.1 Android SDK:Android API 34 Gradle: gradle-7.2-bin.zip CameraX Version: 1.1.0-alpha05 在 build.gradle 中添加 CameraX 的相关依赖 在 AndroidManifest.xml 文件

    2024年02月14日
    浏览(25)
  • 使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序

    CameraX 是一个 Jetpack 库,旨在帮助简化相机应用程序的开发。 [camerax官方文档] https://developer.android.com/training/camerax CameraX的几个用例: Image Capture Video Capture Preview Image analyze 具体如何使用相关用例,请查看上面的官方链接。 下面仅就视频录制用例来叙述相关实现流程。 添加

    2024年02月06日
    浏览(55)
  • Android CameraX适配Android13的踩坑之路

    最近把AGP插件升级到8.1.0,新建项目的时候目标版本和编译版本都是33,发现之前的demo使用Camerax拍照和录像都失败了,于是查看了一下官网和各种资料,找到了Android13的适配方案. 与早期版本一样,Android 13 包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影

    2024年02月12日
    浏览(63)
  • 【android开发-21】android中调用系统摄像头camera拍照和相册的用法详解

    1, 调用摄像头 在Android中,调用系统摄像头拍照需要使用Intent来启动Camera应用,并在应用中设置相应的权限。下面是一个简单的例子:

    2024年02月21日
    浏览(37)
  • Android 实现相机(CameraX)预览

    CameraX 是一个 Jetpack 库,旨在帮助您更轻松地开发相机应用。 对于新应用,我们建议从 CameraX 开始。它提供一致且易于使用的 API,适用于绝大多数 Android 设备,并向后兼容 Android 5.0(API 级别 21)。 CameraX 支持大多数常见的相机用例: 预览 :在屏幕上查看图片。 图片分析 :

    2024年02月15日
    浏览(28)
  • Android 之 使用 Camera 拍照

    本节给大家带来的是Android中Camera的使用,简单点说就是拍照咯,无非两种: 1.调用系统自带相机拍照,然后获取拍照后的图片 2.要么自己写个拍照页面 本节我们来写两个简单的例子体验下上面的这两种情况~ 我们只需下面一席话语,即可调用系统相机,相机拍照后会返回一个

    2024年02月09日
    浏览(28)
  • Android之 Camera相机使用

    一 简介 1.1 随着信息时代的发展,相机在我们生活中使用越来越频繁,也成为手机的基本配置之一。相机可以用来拍照,拍视频,人脸识别,视频聊天,扫码支付,监控等常见领域 不管什么场景,基本原理都差不多,都要先通过相机采集原始数据,也就是二进制字节数据,我

    2024年02月15日
    浏览(28)
  • Android 使用Camera1实现相机预览、拍照、录像

    本文介绍如何从零开始,在 Android 中实现 Camera1 的接入,并在文末提供 Camera1Manager 工具类,可以用于快速接入 Camera1 。 Android Camera1 API 虽然已经被 Google 废弃,但有些场景下不得不使用。 并且 Camera1 返回的帧数据是 NV21 ,不像 Camera2 、 CameraX 那样,需要自己再转一层,才能得

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包