本文首发于公众号“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) {
                // 处理拍照失败的逻辑
            }
        }
    )
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

在上述代码中,startCamera 函数用于初始化相机并绑定预览和拍照用例,takePhoto 函数用于执行拍照操作,并处理拍照成功或失败的回调 。

最佳实践:
  • 确保在应用的最低 API 级别为 21 或更高版本的设备上使用 CameraX。
  • 在 AndroidManifest.xml 中添加必要的权限声明。
  • 使用 ActivityCompatContextCompat 处理运行时权限请求。
  • onDestroy 方法中释放 CameraX 相关资源,如关闭 ExecutorService
  • 考虑使用 ViewBinding 来绑定布局,提高代码的可读性和安全性 。

通过遵循上述步骤和最佳实践,您可以高效地使用 CameraX 开发功能丰富且稳定的相机应用。


欢迎关注我的公众号AntDream查看更多精彩文章!