최신 카메라 앱은 강력하고 중복되는 기능으로 정의됩니다. 사용자는 멋진 HDR로 동영상을 녹화하고, 60FPS로 부드러운 동작을 포착하고, 미리보기 안정화로 매우 부드러운 영상을 얻을 수 있기를 기대합니다. 이러한 작업을 동시에 수행하는 경우가 많습니다.
개발자로서 우리는 현실이 더 복잡하다는 것을 알고 있습니다. 특정 기기가 주어진 조합을 실제로 지원하는지 어떻게 보장할 수 있나요? 지금까지는 여러 기능을 사용 설정하는 것이 도박과 같았습니다. 개별 기능 지원을 확인할 수 있지만 이를 결합하면 정의되지 않은 동작이나 더 나아가 카메라 세션 실패가 발생할 수 있습니다. 이러한 불확실성으로 인해 개발자는 보수적으로 접근하게 되며, 이로 인해 성능이 우수한 기기의 사용자가 최상의 환경에 액세스할 수 없습니다.
예를 들어 프리미엄 기기 중 HDR과 60FPS 동영상을 동시에 안정적으로 지원하는 기기는 매우 적습니다. 따라서 대부분의 앱은 대부분의 휴대전화에서 좋지 않은 사용자 환경을 방지하기 위해 두 기능을 동시에 사용 설정하지 않습니다.
이를 해결하기 위해 이러한 추측을 없애도록 설계된 새로운 API인 CameraX의 기능 그룹이 도입됩니다. 이제 카메라를 구성하기 전에 특정 기능 조합이 지원되는지 쿼리하거나, CameraX에 우선순위를 알려주면 CameraX가 가장 잘 지원되는 조합을 사용 설정하도록 할 수 있습니다.
CameraX를 처음 사용하는 경우
새로운 기능 그룹 API를 자세히 살펴보기 전에 CameraX가 무엇인지 간단히 복습해 보겠습니다. CameraX는 카메라 앱 개발을 더 쉽게 할 수 있도록 만들어진 Jetpack 지원 라이브러리입니다. 이는 대부분의 Android 기기에서 작동하는 일관되고 사용하기 쉬운 API 노출 영역을 제공하고 Android 6.0 (API 수준 23)까지 하위 호환됩니다. CameraX를 처음 사용하는 경우 공식 문서를 확인하고 Codelab을 사용해 시작하는 것이 좋습니다.
Feature Group API로 빌드할 수 있는 항목
더 이상 기능 조합에 의존하지 않아도 되며, 지원되는 하드웨어 (예: Pixel 10 Pro)에서 동시 HDR 및 60FPS 동영상과 같은 최상의 카메라 환경을 자신 있게 제공하면서 조합을 지원할 수 없는 기기에서는 오류를 방지할 수 있습니다.
HDR과 60FPS를 동시에 사용 설정하는 Pixel 10 Pro
HDR과 60FPS를 동시에 실행할 수 없는 이전 기기에서는 HDR만 사용 설정되고 60FPS 옵션은 사용 중지됩니다.
Feature Group API를 사용하면 다음 작업을 할 수 있습니다.
- 더 스마트한 동적 UI 빌드: 실시간 하드웨어 지원에 따라 UI에서 설정을 지능적으로 사용 설정 또는 사용 중지합니다. 예를 들어 사용자가 HDR을 사용 설정하면 해당 기기에서 조합이 지원되지 않는 경우 60FPS 옵션을 즉시 회색으로 표시하고 사용 중지할 수 있습니다.
- 신뢰할 수 있는 '고화질' 모드 제공: 원하는 기능의 우선순위 목록으로 카메라를 구성합니다. CameraX는 지정된 기기에 가장 적합한 조합을 자동으로 찾아 사용 설정하므로 복잡한 기기별 로직 없이도 우수한 결과를 얻을 수 있습니다.
- 카메라 세션 실패 방지: 미리 지원을 확인하면 카메라가 지원되지 않는 조합을 구성하려고 시도하지 않으므로 비정상 종료의 일반적인 원인을 제거하고 원활한 사용자 환경을 제공할 수 있습니다.
작동 방식: 핵심 구성요소
새 API는 SessionConfig 및 CameraInfo에 대한 주요 추가사항을 중심으로 합니다.
- GroupableFeature: 이 API는 HDR_HLG10, FPS_60, PREVIEW_STABILIZATION, IMAGE_ULTRA_HDR과 같은 사전 정의된 그룹화 가능한 기능 집합을 도입합니다. 계산 제한으로 인해 이 API가 제공하는 높은 신뢰도로 특정 기능 집합만 그룹화할 수 있습니다. Google은 이 목록을 확대하기 위해 최선을 다하고 있으며 향후 출시에서 더 많은 기능을 지원할 예정입니다.
- 새 SessionConfig 매개변수: 카메라 세션을 시작하는 데 사용되는 이 클래스는 이제 다음 두 가지 새 매개변수를 허용합니다.
requiredFeatureGroup: 구성이 성공하려면 지원해야 하는 기능에 사용합니다. 사용자가 명시적으로 사용 설정하는 기능(예: 'HDR' 스위치 전환)에 적합합니다. 결정적이고 일관된 환경을 보장하기 위해bindToLifecycle호출은 기능 요청을 무시하는 대신 요청된 조합이 지원되지 않는 경우IllegalArgumentException을 발생시킵니다.CameraInfo#isFeatureGroupSupportedAPI (아래 세부정보 참고)를 사용하여 이 결과를 미리 쿼리해야 합니다.preferredFeatureGroup: 원하는 기능이지만 선택사항인 경우에 사용합니다(예: 기본 '고화질' 모드를 구현하려는 경우). 우선순위에 따라 정렬된 원하는 기능 목록을 제공하면 CameraX가 기기에서 지원하는 우선순위가 가장 높은 조합을 자동으로 사용 설정합니다.
- CameraInfo#isFeatureGroupSupported(): 기능 그룹이 지원되는지 명시적으로 확인하는 핵심 쿼리 메서드로, 앱 UI에서 지원되는 기능 옵션만 사용자에게 제공하는 데 적합합니다.
SessionConfig를 전달하면 조합이 지원되는지 여부를 나타내는 불리언이 반환됩니다. 필수 기능이 있는SessionConfig를 바인딩하려는 경우 먼저 이 API를 사용하여 지원되는지 확인해야 합니다.
실무에서의 구현
이러한 구성요소를 사용하여 더 나은 카메라 환경을 빌드하는 방법을 살펴보겠습니다.
시나리오 1: '최선'의 고품질 모드
기본적으로 최적의 기능을 사용 설정하려면 우선순위가 지정된 목록을 preferredFeatureGroup에 제공하면 됩니다. 이 예에서는 CameraX에 HDR을 우선시하고, 60FPS, 마지막으로 미리보기 흔들림 보정을 우선시하도록 지시합니다. CameraX는 가능한 모든 조합을 확인하고 기기에서 지원하는 최적의 조합을 선택하는 복잡성을 처리합니다.
예를 들어 기기에서 HDR과 60FPS를 함께 처리할 수 있지만 미리보기 안정화는 처리할 수 없는 경우 CameraX는 처음 두 가지를 사용 설정하고 세 번째는 삭제합니다. 이렇게 하면 복잡한 기기별 검사를 작성하지 않고도 최상의 환경을 얻을 수 있습니다.
cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, SessionConfig( useCases = listOf(preview, videoCapture), // The order of features in this list determines their priority. // CameraX will enable the best-supported combination based on these // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization. preferredFeatureGroup = listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION), ).apply { // (Optional) Get a callback with the enabled features // to update your UI. setFeatureSelectionListener { selectedFeatures -> updateUiIndicators(selectedFeatures) } } )
이 코드 스니펫의 경우 CameraX는 다음 우선순위 순서로 기능 조합을 사용 설정하려고 시도하여 기기에서 완전히 지원하는 첫 번째 조합을 선택합니다.
- HDR + 60FPS + 미리보기 손떨림 보정
- HDR + 60 FPS
- HDR + 미리보기 손떨림 보정
- HDR
- 60FPS + 미리보기 흔들림 보정
- 60 FPS
- 미리보기 손떨림 보정
- 위의 기능 중 해당 사항 없음
시나리오 2: 반응형 UI 빌드
사용자 선택에 응답하고 사용자가 지원되지 않는 기능 조합을 선택하지 못하도록 하는 UI를 만들려면 지원을 직접 쿼리하면 됩니다. 아래 함수는 사용자의 현재 선택과 호환되지 않는 기능을 확인하여 해당 UI 요소를 사용 중지할 수 있도록 합니다.
/** * Returns a list of features that are NOT supported in combination * with the currently selected features. */ fun getUnsupportedFeatures( currentFeatures: Set<GroupableFeature> ): Set<GroupableFeature> { val unsupportedFeatures = mutableSetOf<GroupableFeature>() val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION) // Iterate over every available feature option in your app. appFeatureOptions.forEach { featureOption -> // Skip features the user has already selected. if (currentFeatures.contains(featureOption)) return@forEach // Check if adding this new feature is supported. val isSupported = cameraInfo.isFeatureGroupSupported( SessionConfig( useCases = useCases, // Check the new feature on top of existing ones. requiredFeatureGroup = currentFeatures + featureOption ) ) if (!isSupported) { unsupportedFeatures.add(featureOption) } } return unsupportedFeatures }
그런 다음 이 로직을 ViewModel 또는 UI 컨트롤러에 연결하여 사용자 입력에 반응하고 작동이 보장된 구성으로 카메라를 다시 바인딩할 수 있습니다.
// Invoked when user turns some feature on/off. fun onFeatureChange(currentFeatures: Set<GroupableFeature>) { // Identify features that are unsupported with the current selection. val unsupportedFeatures = getUnsupportedFeatures(currentFeatures) // Update app UI so that users can't enable them. updateDisabledFeatures(unsupportedFeatures) // Since the UI now only allows selecting supported feature combinations, // `currentFeatures` is always valid. This allows setting // `requiredFeatureGroup` directly, without needing to re-check for // support or set a feature selection listener. cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, SessionConfig( useCases = listOf(preview, videoCapture), requiredFeatureGroup = currentFeatures, ) ) }
작동하는 애플리케이션에서 이러한 개념을 확인하려면 Google 내부 테스트 앱을 살펴보세요. 위에서 설명한 '최선의 노력' 및 '반응형 UI' 시나리오가 모두 완전히 구현되어 있습니다.
참고: 이 애플리케이션은 테스트 애플리케이션이며 공식적으로 지원되는 샘플이 아닙니다. 기능 그룹 API를 참고하기에는 좋지만 프로덕션용으로 다듬어지지는 않았습니다.
지금 시작하기
기능 그룹 API는 고급 카메라 기능 작업의 모호성을 제거합니다. 기능 지원을 쿼리하는 결정론적 방법을 제공하여 강력하고 안정적인 카메라 앱을 자신 있게 빌드할 수 있습니다.
이 API는 CameraX 1.5에서 실험용으로 제공되며 1.6 출시에서 완전히 안정화될 예정입니다. 더 많은 지원과 개선사항이 제공될 예정입니다.
자세한 내용은 공식 문서를 참고하세요. 앞으로 보여주실 크리에이터님의 창작 활동이 정말 기대되며, 의견도 기다리고 있습니다. 다음 채널을 통해 의견을 공유하고 문제를 신고해 주세요.
계속 읽기
-
제품 소식
이제 Android Emulator를 사용하면 멀티 디바이스 상호작용을 그 어느 때보다 쉽게 테스트할 수 있습니다.
Steven Jenkins • 전문 길이: 2분
-
제품 소식
모든 개발자의 AI 워크플로와 요구사항은 고유하며, AI가 개발에 어떤 도움을 줄지 선택할 수 있는 것이 중요합니다. 1월에는 Android 스튜디오에서 AI 기능을 구동하는 데 로컬 또는 원격 AI 모델을 선택할 수 있는 기능이 도입되었습니다.
Matthew Warner • 전문 길이: 2분
-
제품 소식
이제 Android 스튜디오 Panda 3가 안정화되어 프로덕션에서 사용할 수 있습니다. 이번 출시를 통해 AI 기반 워크플로를 더욱 세부적으로 제어하고 맞춤설정할 수 있어 고품질 Android 앱을 그 어느 때보다 쉽게 빌드할 수 있습니다.
Matt Dyor • 3분 읽기
소식 받아 보기
Android 개발 관련 최신 정보를 이메일로 받아 보세요.