0Pricing
Android Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. CameraX 概览
  2. 显示摄像头预览
  3. 拍照
  4. 录制视频
← 返回 Android Academy