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


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

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查看更多精彩文章!