Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11

CameraX 1.5: Как обеспечить совместимость функций камеры в Android-приложениях

CameraX 1.5 упрощает разработку Android-приложений для камеры с новым API Feature Group. Узнайте, как гарантировать поддержку комбинаций HDR, 60 FPS и стабилизации для создания надежных и мощных приложений.

74 открытий1К показов
CameraX 1.5: Как обеспечить совместимость функций камеры в Android-приложениях

Эта статья — перевод оригинального материала о новых возможностях CameraX 1.5, адаптированный для русскоязычной аудитории с сохранением смысла и стиля оригинала.

Современные приложения для камеры должны сочетать мощные функции: пользователи хотят снимать видео в HDR, с частотой 60 кадров в секунду и стабилизацией изображения — и всё это одновременно. Но как разработчику гарантировать, что устройство поддерживает такую комбинацию?

Ранее совмещение нескольких функций было рискованным: проверка поддержки каждой функции по отдельности не гарантировала их совместной работы. Это могло привести к нестабильной работе камеры или её полному сбою. Чтобы избежать проблем, разработчики ограничивали функциональность, лишая пользователей с мощными устройствами, такими как Pixel 10 Pro, полноценного опыта.

CameraX 1.5 решает эту проблему с помощью нового API Feature Group. Теперь вы можете заранее проверить поддержку комбинации функций или задать приоритеты, а библиотека сама подберёт оптимальную конфигурацию для устройства.

Что такое CameraX?

CameraX — это библиотека Jetpack, которая упрощает разработку приложений для камеры на Android. Она предлагает удобный и единообразный API, совместимый с большинством устройств, начиная с Android 6.0 (API level 23). Для новичков рекомендуем изучить официальную документацию и пройти практический codelab.

Возможности API Feature Group

Новый API позволяет создавать продвинутые приложения для камеры, избегая проблем с совместимостью. Вы сможете:

  • Создавать адаптивные интерфейсы: Динамически включать или отключать настройки в зависимости от возможностей устройства. Например, если пользователь включает HDR, опция 60 FPS автоматически станет недоступной, если комбинация не поддерживается.
  • Реализовать режим “Максимальное качество”: Укажите желаемые функции с приоритетами, и CameraX выберет лучшую комбинацию, поддерживаемую устройством, без сложной логики.
  • Избежать сбоев: Проверка поддержки комбинаций заранее предотвращает ошибки при настройке камеры, обеспечивая стабильную работу.

Как это работает: основные компоненты

API построен на обновленных классах SessionConfig и CameraInfo.

  • GroupableFeature: Включает набор функций, таких как HDR_HLG10, FPS_60, PREVIEW_STABILIZATION и IMAGE_ULTRA_HDR. Список пока ограничен из-за вычислительных требований, но будет расширен в следующих версиях.
  • Новые параметры SessionConfig:requiredFeatureGroup: Для обязательных функций. Если комбинация не поддерживается, вызов bindToLifecycle завершится ошибкой IllegalArgumentException.preferredFeatureGroup :Для необязательных функций. Укажите список с приоритетами, и CameraX выберет лучшую комбинацию.
  • requiredFeatureGroup: Для обязательных функций. Если комбинация не поддерживается, вызов bindToLifecycle завершится ошибкой IllegalArgumentException.
  • preferredFeatureGroup: Для необязательных функций. Укажите список с приоритетами, и CameraX выберет лучшую комбинацию.
  • CameraInfo#isFeatureGroupSupported(): Метод для проверки поддержки комбинации функций. Передайте SessionConfig, чтобы узнать, поддерживается ли набор функций, и настройте интерфейс соответственно.
CameraX 1.5: Как обеспечить совместимость функций камеры в Android-приложениях 1

Практическое применение

Рассмотрим два сценария использования API.

Сценарий 1: Режим "Максимальное качество"

Чтобы автоматически включить лучшие функции, задайте список приоритетов в preferredFeatureGroup. Например, приоритет: HDR, затем 60 FPS, затем стабилизация. CameraX сам выберет оптимальную комбинацию.

			cameraProvider.bindToLifecycle(
    lifecycleOwner,
    cameraSelector,
    SessionConfig(
        useCases = listOf(preview, videoCapture),
        // Приоритеты: HDR_HLG10 > FPS_60 > PREVIEW_STABILIZATION
        preferredFeatureGroup = listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)
    ).apply {
        setFeatureSelectionListener { selectedFeatures ->
            updateUiIndicators(selectedFeatures) // Обновление интерфейса
        }
    }
)
		

CameraX проверит комбинации в порядке приоритета, выбрав первую поддерживаемую:

  1. HDR + 60 FPS + Стабилизация
  2. HDR + 60 FPS
  3. HDR + Стабилизация
  4. HDR
  5. 60 FPS + Стабилизация
  6. 60 FPS
  7. Стабилизация
  8. Ничего

Сценарий 2: Адаптивный интерфейс

Для интерфейса, реагирующего на выбор пользователя, проверяйте неподдерживаемые комбинации:

			fun getUnsupportedFeatures(currentFeatures: Set): Set {
    val unsupportedFeatures = mutableSetOf()
    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)

    appFeatureOptions.forEach { featureOption ->
        if (currentFeatures.contains(featureOption)) return@forEach
        val isSupported = cameraInfo.isFeatureGroupSupported(
            SessionConfig(
                useCases = useCases,
                requiredFeatureGroup = currentFeatures + featureOption
            )
        )
        if (!isSupported) unsupportedFeatures.add(featureOption)
    }
    return unsupportedFeatures
}
		

Интегрируйте логику в интерфейс для отключения неподдерживаемых опций и привязки стабильной конфигурации:

			fun onFeatureChange(currentFeatures: Set) {
    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)
    updateDisabledFeatures(unsupportedFeatures)
    cameraProvider.bindToLifecycle(
        lifecycleOwner,
        cameraSelector,
        SessionConfig(
            useCases = listOf(preview, videoCapture),
            requiredFeatureGroup = currentFeatures
        ).apply {
            setFeatureSelectionListener { selectedFeatures ->
                updateUiIndicators(selectedFeatures)
            }
        }
    )
}
		

Ознакомьтесь с тестовым приложением CameraX для примера реализации (не для продакшена).

API Feature Group устраняет неопределенность при работе с продвинутыми функциями камеры, позволяя создавать надежные приложения. Он доступен как экспериментальный в CameraX 1.5 и станет стабильным в версии 1.6 с дополнительными улучшениями.
Следите за новыми постами
Следите за новыми постами по любимым темам
74 открытий1К показов