Android Jetpack中的CameraX组件使用指南

健身生活志 2023-09-17 ⋅ 18 阅读

Android Jetpack是一个用于帮助开发者更轻松开发Android应用的工具包,在其中,CameraX组件提供了一种简单而强大的方式来访问和控制设备的相机功能。本文将为您介绍如何使用CameraX组件来实现相机功能。

引入依赖

首先,在您的项目的build.gradle文件中添加CameraX的依赖:

dependencies {
    def camerax_version = "1.1.0-beta07"
    implementation "androidx.camera:camera-core:$camerax_version"
    implementation "androidx.camera:camera-camera2:$camerax_version"
}

配置相机权限

在AndroidManifest.xml文件中添加相机使用权限:

<uses-permission android:name="android.permission.CAMERA" />

设置相机预览布局

在您的布局文件中,添加一个TextureView来显示相机预览:

<TextureView
    android:id="@+id/textureView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

创建相机实例

在您的Activity或Fragment类中,创建一个相机实例:

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

private fun startCamera() {
    // 初始化相机
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    cameraProviderFuture.addListener(Runnable {
        cameraProvider = cameraProviderFuture.get()
        // 设置预览
        preview = Preview.Builder().build()
        preview.setSurfaceProvider(textureView.surfaceProvider)
        // 设置图像捕获
        imageCapture = ImageCapture.Builder().build()

        try {
            // 绑定相机用例到生命周期
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, preview, imageCapture)
        } catch (exc: Exception) {
            Log.e(TAG, "无法绑定相机用例", exc)
        }
    }, ContextCompat.getMainExecutor(this))
}

拍照功能

要实现拍照功能,您可以在适当的时机调用以下代码:

private fun takePhoto() {
    val imageCapture = imageCapture ?: return

    val photoFile = File(externalMediaDirs.firstOrNull(), "${System.currentTimeMillis()}.jpg")

    val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

    imageCapture.takePicture(
        outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                val savedUri = Uri.fromFile(photoFile)
                val msg = "照片已保存到:$savedUri"
                Toast.makeText(this@MainActivity, msg, Toast.LENGTH_SHORT).show()
                Log.d(TAG, msg)
            }

            override fun onError(exception: ImageCaptureException) {
                Log.e(TAG, "拍照错误:${exception.message}", exception)
            }
        }
    )
}

结语

通过使用CameraX组件,您可以更轻松地实现相机功能,并且具备更大的灵活性和扩展性。CameraX还提供了其他功能,如图像分析、视频录制等,可根据您的需求进行进一步的探索和应用。


全部评论: 0

    我有话说: