跳到主要内容

CameraX

CameraX 是 Android Jetpack 中的一个库,旨在简化相机应用的开发。它提供了一个一致且易于使用的 API,适用于大多数 Android 设备,并且能够自动处理设备之间的兼容性问题。无论你是初学者还是有经验的开发者,CameraX 都能帮助你快速构建功能强大的相机应用。

什么是 CameraX?

CameraX 是一个基于 camera2 API 的高级封装库,旨在简化相机功能的实现。它提供了以下主要功能:

  • 预览(Preview):在屏幕上显示相机捕获的图像。
  • 图像分析(Image Analysis):对捕获的图像进行实时分析。
  • 图像捕获(Image Capture):拍摄高质量的照片。

CameraX 还支持生命周期感知,能够自动管理相机的启动和关闭,从而减少内存泄漏和其他常见问题。

开始使用 CameraX

1. 添加依赖

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

groovy
dependencies {
def camerax_version = "1.3.0"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
}

2. 配置相机权限

AndroidManifest.xml 中添加相机权限:

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

3. 初始化 CameraX

在你的 Activity 或 Fragment 中初始化 CameraX。以下是一个简单的示例,展示了如何设置相机预览:

kotlin
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner

class CameraActivity : AppCompatActivity() {

private lateinit var previewView: PreviewView

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera)

previewView = findViewById(R.id.previewView)

startCamera()
}

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

cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

// 设置预览用例
val preview = Preview.Builder().build().also {
it.setSurfaceProvider(previewView.surfaceProvider)
}

// 选择后置摄像头
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

try {
// 解除绑定所有用例
cameraProvider.unbindAll()

// 绑定用例到生命周期
cameraProvider.bindToLifecycle(
this as LifecycleOwner, cameraSelector, preview
)
} catch (exc: Exception) {
Log.e("CameraX", "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
}

4. 图像捕获

要捕获图像,你可以使用 ImageCapture 用例。以下是如何配置和触发图像捕获的示例:

kotlin
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import java.io.File

private var imageCapture: ImageCapture? = null

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(output: ImageCapture.OutputFileResults) {
val msg = "Photo saved: ${photoFile.absolutePath}"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
}

override fun onError(exc: ImageCaptureException) {
Log.e("CameraX", "Photo capture failed: ${exc.message}", exc)
}
}
)
}

实际应用场景

CameraX 可以用于多种场景,例如:

  • 社交应用:允许用户拍摄照片并分享到社交平台。
  • 扫描应用:使用图像分析功能实现二维码或条形码扫描。
  • 安全应用:通过实时图像分析进行人脸识别或物体检测。

总结

CameraX 是一个强大的工具,能够帮助开发者轻松实现相机功能。通过本指南,你已经学会了如何设置相机预览、捕获图像,并了解了 CameraX 的实际应用场景。希望这些内容能够帮助你在 Android 开发中更好地使用 CameraX。

附加资源

提示

练习:尝试在你的应用中添加一个功能,允许用户切换前置和后置摄像头,并捕获图像。