CameraX 概览
了解 CameraX 相比旧版摄像头 API 的优势
CameraX 概览 是 CoddyKit 上的免费 Android Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
为什么选择 CameraX?
过去,为 Android 应用添加相机功能非常麻烦。旧版 android.hardware.camera2 API 功能强大,但代码极其冗长,而且在市面上数以千计的设备上表现各不相同。
CameraX 是一个构建在 Camera2 之上的 Jetpack 库,为您提供简单、感知生命周期且行为一致的 API。在本课程中,您将使用 CameraX 显示实时预览、拍照和录制视频。
CameraX 解决的问题
CameraX 围绕三个目标设计:
- 易于使用——比 Camera2 所需的样板代码少得多。
- 一致性——Google 会在大型设备实验室中对其进行测试,因此各种特殊设备也能表现得更加可预测。
- 感知生命周期——相机会随屏幕的生命周期自动启动和停止,因此不会发生相机资源泄漏。
您只需描述想要实现的内容(预览、照片或视频),CameraX 会根据当前设备确定实现方式。
三个核心用例
CameraX 围绕用例构建。用例是一项独立完整的相机功能。主要有以下三个:
Preview——在屏幕上显示相机看到的内容。ImageCapture——拍照。VideoCapture——录制视频。
您可以创建所需的用例,然后将它们一起绑定到相机。
// You create the use cases you need:
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// Later you bind them to a lifecycle and a camera.添加依赖项
CameraX 由多个构件组成。您需要将它们添加到模块的 build.gradle.kts 中。典型配置会引入核心库、camera2 后端、生命周期集成和视图辅助库。
请让所有 CameraX 构件使用相同版本,以避免冲突。
dependencies {
val cameraxVersion = "1.3.4"
implementation("androidx.camera:camera-core:$cameraxVersion")
implementation("androidx.camera:camera-camera2:$cameraxVersion")
implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
implementation("androidx.camera:camera-view:$cameraxVersion")
implementation("androidx.camera:camera-video:$cameraxVersion")
}声明权限
要使用相机,您必须在 AndroidManifest.xml 中声明 CAMERA 权限。如果还要录制视频,可能需要 RECORD_AUDIO。
这些属于运行时权限——仅声明权限还不够,您还必须在运行时向用户请求权限(后续课程会介绍)。
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />CameraProvider
CameraX 的入口是 ProcessCameraProvider。它会将用例连接到相机以及屏幕的生命周期。
您可以通过 getInstance() 异步获取它,该方法会返回一个 ListenableFuture。在 Kotlin 中,您可以在协程内使用 await() 等待结果。
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.ExperimentalGetImage
suspend fun Context.getCameraProvider(): ProcessCameraProvider {
return ProcessCameraProvider.getInstance(this).await()
}将用例绑定到生命周期
获取 provider 后,您需要将用例绑定到 LifecycleOwner 和 CameraSelector(前置或后置相机)。
由于绑定会感知生命周期,CameraX 会在屏幕可见时自动打开相机,在屏幕不可见时自动关闭相机,无需手动清理。
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview,
imageCapture
)选择相机
CameraSelector 会告诉 CameraX 要使用哪个物理相机。最常见的是默认后置相机和默认前置相机。
您也可以构建自定义选择器来要求特定特征,但默认选项几乎可以满足所有应用的需求。
// Back camera (most common for photos)
val back = CameraSelector.DEFAULT_BACK_CAMERA
// Front camera (selfies, video calls)
val front = CameraSelector.DEFAULT_FRONT_CAMERA
// Toggle between them by swapping the selector and re-binding.PreviewView:显示表面
CameraX 会将实时预览渲染到 PreviewView 中。它是一个普通的 Android View,会为您处理表面、缩放和旋转。
在 Jetpack Compose 中,您可以使用 AndroidView 嵌入它,从而在可组合项中放置传统 View。下一课会完整介绍如何连接这些部分。
AndroidView(
factory = { context ->
PreviewView(context).apply {
scaleType = PreviewView.ScaleType.FILL_CENTER
}
},
modifier = Modifier.fillMaxSize()
)生命周期感知的实际应用
CameraX 最大的实际优势是感知生命周期。使用 Camera2 时,您必须在 onResume 中手动打开相机,并在 onPause 中释放相机;如果忘记这样做,就可能导致崩溃或相机卡住。
使用 CameraX 时,只要调用 bindToLifecycle,框架就会处理这一切。当用户离开当前屏幕时,相机会自动释放;用户返回时,相机会重新打开。
// No manual open/close needed.
// bindToLifecycle ties the camera to the screen's
// lifecycle, so it follows onStart/onStop for you.
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview)您的思维模型
在接下来的课程中,请牢记以下流程:
- 获取
ProcessCameraProvider。 - 构建所需的用例(
Preview、ImageCapture、VideoCapture)。 - 选择一个
CameraSelector。 - 调用
bindToLifecycle将所有部分连接起来。
CameraX 的每项功能都只是这四个步骤的不同变体。
快速检查
测试您对 CameraX 基础知识的理解。
回顾
现在您已经了解 CameraX 的整体工作方式:
- CameraX 用更简单、更一致且感知生命周期的 API 封装了 Camera2。
- 它围绕用例构建:
Preview、ImageCapture和VideoCapture。 - 您需要添加 CameraX 构件,声明
CAMERA权限,获取ProcessCameraProvider,然后调用bindToLifecycle。 CameraSelector用于选择前置或后置相机;PreviewView用于显示相机画面。
接下来,您将连接屏幕上的真实实时预览。
常见问题解答
「CameraX 概览」课时是免费的吗?
是的 — 「CameraX 概览」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「CameraX 概览」这节课中我会学到什么?
了解 CameraX 相比旧版摄像头 API 的优势 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「CameraX 概览」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。