본문으로 건너뛰기

제6장: 카메라 탐색하기

5장에서 프로젝트 설정을 마쳤다면, 이제 우리 앱이 돌아가고 있는 기기에 어떤 카메라들이 달려 있는지 살펴볼 차례입니다. 현대의 스마트폰은 뒷면에만 3-4개의 렌즈가 달려 있는 경우가 흔합니다. Camera2 API는 이 카메라들을 어떻게 구분하고, 각각 어떤 기능을 가지고 있는지 알려줄까요?

이 장에서는 카메라의 "신분증"과도 같은 CameraCharacteristics를 읽어오는 법을 배웁니다. 코드를 작성하기 전에 Android Camera Parameters 앱을 실행해 보세요. 이 앱의 첫 화면이 바로 이번 장에서 우리가 구현할 내용의 완성본입니다.


1. 카메라 ID 목록 가져오기

모든 카메라는 고유한 문자열 ID를 가집니다. CameraManager에게 이 목록을 물어보는 것으로 시작합니다.

val manager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraIdList = manager.cameraIdList // 보통 ["0", "1", "2", ...] 형태로 반환됩니다.
  • ID "0": 관습적으로 메인 후면 카메라를 의미합니다.
  • ID "1": 관습적으로 메인 전면 카메라를 의미합니다.
  • 그 외: 초광각, 망원, 혹은 여러 렌즈를 하나로 묶은 "논리적 카메라" ID가 뒤따릅니다.

2. 방향 구분하기 (LENS_FACING)

각 ID가 가리키는 카메라가 앞을 보는지 뒤를 보는지 확인해야 합니다.

for (cameraId in cameraIdList) {
val characteristics = manager.getCameraCharacteristics(cameraId)
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)

when (facing) {
CameraCharacteristics.LENS_FACING_FRONT -> Log.d("Camera", "ID $cameraId: 전면 카메라")
CameraCharacteristics.LENS_FACING_BACK -> Log.d("Camera", "ID $cameraId: 후면 카메라")
CameraCharacteristics.LENS_FACING_EXTERNAL -> Log.d("Camera", "ID $cameraId: 외부 USB 카메라")
}
}

3. 핵심: 하드웨어 레벨 (Hardware Level)

Camera2 API를 사용할 때 가장 먼저 확인해야 할 가장 중요한 값입니다. 기기가 Camera2 API를 얼마나 제대로 지원하는지를 나타내는 척도입니다.

레벨설명
LEGACY아주 오래된 기기. Camera2 API를 흉내만 낼 뿐, 내부적으로는 이전 API(Camera1)로 작동합니다. 수동 조절이 거의 불가능합니다.
LIMITED기본적인 Camera2 기능을 지원하지만, 고속 연사나 일부 수동 조절 기능이 빠져 있습니다.
FULLCamera2의 핵심 기능을 모두 지원합니다. 프레임별 수동 노출, ISO 조절 등이 완벽하게 작동합니다.
LEVEL_3최상급 플래그십 기기. RAW 캡처, YUV 재처리 등 전문가용 고급 기능을 모두 포함합니다.
val level = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
// 이 레벨에 따라 여러분의 앱에서 '수동 모드' 버튼을 보여줄지 말지 결정해야 합니다.

4. 기타 유용한 정보들

CameraCharacteristics 객체에는 수백 가지의 정보가 담겨 있습니다. 몇 가지만 더 살펴볼까요?

  • 센서 해상도: SENSOR_INFO_PIXEL_ARRAY_SIZE를 통해 48MP인지 12MP인지 알 수 있습니다.
  • 초점 거리: LENS_INFO_AVAILABLE_FOCAL_LENGTHS를 통해 광각 렌즈인지 망원 렌즈인지 구분합니다.
  • 플래시 유무: FLASH_INFO_AVAILABLE이 true인 카메라에만 플래시 버튼을 보여줘야 합니다.

요약

  1. manager.cameraIdList로 기기에 있는 카메라들을 찾습니다.
  2. LENS_FACING으로 앞뒤 방향을 구분합니다.
  3. INFO_SUPPORTED_HARDWARE_LEVEL을 확인하여 우리 앱의 고급 기능을 활성화할지 결정합니다.

다음 단계

이제 어떤 카메라를 쓸지 결정했습니다. 이제 그 카메라를 진짜로 "열어서" 사용할 준비를 해야 합니다. 제7장: 카메라 열기에서는 비동기 방식으로 카메라 장치에 연결하고, 다른 앱과의 충돌을 방지하는 안전한 방법을 배웁니다.