본문 바로가기
Android

[깡샘의 안드로이드 프로그래밍] 정리 30 - Camera2 API

by 들풀민들레 2018. 1. 6.

 

본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

 

 

 

28장. 카메라 활용

 

28.3.2. Camera2 API 활용

 

앞에서 설명한 전체 흐름도의 4가지 흐름의 코드를 작성하는 방법을 살펴보겠습니다.

 

카메라 정보 추출

 

 

카메라와 관련된 모든 작업은 CameraManager부터 시작됩니다. CameraManager는 getSystemService ( ) 함수로 얻으면 됩니다.

 

manager = (CameraManager)getSystemService(CAMERA_SERVICE);

 

CameraManager의 getCameraIdList ( ) 함수를 호출하여 스마트폰에 탑재된 카메라의 식별자를 얻을 수 있습니다.

 

for (String cameraId : manager.getCameraIdList()) {

characteristics = manager.getCameraCharacteristics(cameraId);

//...

}

 

getCameraIdList ( ) 함수로 얻은 값은 문자열 배열입니다. 필자의 스마트폰에서 테스트해 보면 배열의 크기가 2로 나옵니다. 즉, 필자의 스마트폰은 카메라가 앞뒤로 두 개 탑재되었다는 의미입니다. 기기에 따라 스마트폰에 탑재된 카메라의 개수는 차이가 있을 수 있습니다.

이렇게 얻은 카메라 식별자 문자열을 매개변수로 지정하여 CameraManager의 getCameraCharacteristics ( ) 함수를 호출하면 각 카메라의 정보를 담고 있는 CameraCharacteristics 객체를 얻을 수 있습니다.

 

CameraCharacteristics에 담긴 각종 정보를 추출하려면 각 정보에 해당하는 getter 함수를 이용하는 구조가 아니라, 획득하려는 정보에 해당하는 키값을 get ( ) 함수의 매개변수로 지정하여 얻는 구조입니다.

 

characteristics.get(characteristics.LENS_FACING)

 

characteristics.LENS_FACING은 카메라의 렌즈 방향을 얻을 때 사용하는 키로 다음의 상숫값으로 데이터를 얻습니다.

 

  • LENS_FACING_FRONT: 전면 카메라. value : 0
  • LENS_FACING_BACK: 후면 카메라. value : 1
  • LENS_FACING_EXTERNAL: 기타 카메라. value : 2

 

만약 후면 카메라만 제어하고 싶다면 위의 값으로 조건문을 걸어 사용하면 됩니다.

 

if (characteristics.get(characteristics.LENS_FACING) ==

CameraCharacteristics.LENS_FACING_BACK) {

//...

}

 

카메라 렌즈 방향 이외에 CameraCharacteristics을 이용해 얻을 수 있는 정보 중 중요 정보 몇 가지를 더 보겠습니다.

 

StreamConfigurationMap info = cameraCharacteristics

.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

Size[] outputSizes=info.getOutputSizes(ImageFormat.JPEG);

 

CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP 키값으로 StreamConfigurationMap 객체를 얻을 수 있는데, 이 객체에 카메라의 각종 지원 정보가 포함되어 있습니다.

StreamConfigurationMap에서 얻는 정보 중 가장 중요한 정보는 카메라에서 지원하는 크기 목록입니다. getOutputSizes ( ) 함수에 이미지 포맷을 매개변수로 지정하면 지원하는 크기 목록이 Size 객체의 배열로 반환되는데, 이 값을 이용하여 사진 촬영 시 사진 크기를 지정할 수 있습니다.

 

int mSensorOrientation = cameraCharacteristics

.get(CameraCharacteristics.SENSOR_ORIENTATION);

 

CameraCharacteristics.SENSOR_ORIENTATION 키값으로 얻는 카메라의 방향도 자주 이용하는 정보인데, 이 정보를 이용해야 사진 촬영 시 사진의 방향을 정상으로 출력할 수 있습니다.