Обзор 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 — локальная установка не требуется.