0Pricing
Android Academy · Урок

Обзор CameraX

Почему стоит выбрать CameraX вместо старых API камеры

«Обзор CameraX» — бесплатный урок Android Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Зачем нужен CameraX

Раньше добавить камеру в приложение для Android было непросто. Старый API android.hardware.camera2 обладает широкими возможностями, но чрезвычайно многословен и по-разному работает на тысячах представленных на рынке устройств.

CameraX — это библиотека Jetpack, работающая поверх Camera2 и предоставляющая простой, учитывающий жизненный цикл и единообразный 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")
}

Объявление разрешений

Чтобы использовать камеру, необходимо объявить разрешение CAMERA в файле AndroidManifest.xml. Если вы также записываете видео, может потребоваться 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" />

Поставщик камеры

Точкой входа в 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()
}

Привязка сценариев использования к жизненному циклу

Получив поставщик, привяжите сценарии использования к 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, позволяющего разместить классическое представление внутри компонуемого элемента. В следующем уроке вы полностью настроите эту интеграцию.

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 оборачивает Camera2 и предоставляет более простой, единообразный API, учитывающий жизненный цикл.
  • Он построен вокруг сценариев использования: Preview, ImageCapture и VideoCapture.
  • Вы добавляете артефакты CameraX, объявляете разрешение CAMERA, получаете ProcessCameraProvider и вызываете bindToLifecycle.
  • CameraSelector выбирает переднюю или заднюю камеру, а PreviewView отображает изображение с камеры.

Далее вы настроите настоящий предварительный просмотр в реальном времени на экране.

Часто задаваемые вопросы

Урок «Обзор CameraX» бесплатный?

Да — полный текст урока «Обзор CameraX» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обзор CameraX»?

Почему стоит выбрать CameraX вместо старых API камеры Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Обзор CameraX»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор CameraX
  2. Отображение предварительного просмотра с камеры
  3. Съёмка фотографий
  4. Запись видео
← Назад к Android Academy