CameraX는 Jetpack에 포함된 서포트 라이브러리로 카메라 앱 개발을 쉽게 할 수 있도록 도와 줍니다.

특징

  • Camera2를 사용하므로 Android 5.0 (API level 21)까지만 지원
  • 유즈케이스 기반으로 설계되어 Preview, Image Processing, Image Capture 유즈 케이스 동시 지원
  • 생명주기를 인식함
  • 장치 호환성 문제 해결함으로 기기별 분기코드 감소
  • 특정 디바이스에 종속되는 Bokeh, HDR 등과 같은 이펙트 지원 

 

최소 요구 사항

CameraX 라이브러리를 사용하기 위해서는 다음과 같은 조건을 만족해야합니다.

  • Android API Level 21 (롤리팝 5.0)
  • 안드로이드 아키텍처 컴포넌트 1.1.1 버전
  • lifecycle-aware액티비티로는 FragmentActivity 또는  AppCompatActivity 사용

카메라 샘플 프로젝트 앱 만들어 보기

CameraX를 이용하여 미리보기, 사진찍기,이미지 프로세싱 3가지 유즈케이스를 포함하는 샘플 앱을 만들어 보도록 하겠습니다. 먼저 안드로이드 스튜디오를 열고 새로운 프로젝트를 만들어 주세요.

의존성 추가하기

CameraX라이브러리를 사용하기 위해서는 Google Maven 저장소를 프로젝트에 추가해야합니다.
프로젝트 레벨의 build.gradle을 열어 google() 리파지토리를 다음과 같이 추가합니다.

모듈레벨의 build.gradle에도 다음을 추가합니다.

최신버전의 CameraX를 확인하시려면 링크를 클릭해주세요

미리보기 뷰 만들기(ViewFinder)

구글 공식 카메라X 예제에서는 ViewFinder(뷰파인더)라는 명칭을 쓰네요. 저도 뷰파인더라고 하겠습니다.
뷰파인더로 만들 View는 TextureView로 하겠습니다.

Note : TextureView를 사용하는 이유는 카메라로 부터 얻는 콘텐츠 스트림을 표현할 수 있는 적절한 뷰이기 때문입니다. Android에서는 이러한 스트림을 SurfaceTexture로 다룹니다. 좀 더 자세한 내용은 안드로이드 그래픽 시스템 및 카메라2 Basic 소스 분석 편을 참고해주세요

권한 요청하기

안드로이드 시스템에서 카메라를 사용하기 위해서는 반드시 권한이 필요합니다. 매니페스트에 다음과 같이 선언해줍니다.

MainActivity 클래스에 다음과 같은 상수를 선언합니다.

MainActivity 내부에 다음과 같은 필드와 메소드를 선언합니다. 카메라에 대한 권한이 요청되고 권한이 승인 되면  startCamera()를 호출하게 됩니다.

MainActivity의 onCreate() 내부를 보도록하겠습니다. 

이제 앱을 시작하면 카메라 권한을 체크하게 됩니다. 권한이 이미 승인된적이 있다면 startCamera()를 직접적으로 호출하게 될것이고, 그렇지 않다면 권한을 요청하여 승인되었을 때 startCamera()를 호출합니다.

Note :  startCamera()를 메인쓰레드에서 호출하는 대신에 viewFinder.post {…}에서 호출했는데 이는 뷰파인더가 확실히 인플레이팅이 끝난담에 호출하기 위함입니다.

미리보기(뷰파인더) 구현하기

startCamera() 메소드 내에서 CameraX라이브러리를 통해 뷰파인더를 구현해 보도록 하겠습니다.

Note이 글을 쓰는 시점에서는 포함된 AppCompat 라이브러리에 FragmentActivity를 상속받았지만 LifecycleOwner가 구현되지 않은 경우 bindToLifecycle 메서드 호출시 오류가 발생할 수 있습니다. 그렇다면 기존 AppCompat 라이브러리의 종속성을 다음과 같이 변경해주세요.

이제 updateTransform()을 구현하여 기기의 회전방향에 따라 카메라 영상도 알맞게 매핑 될 수 있도록 합니다.

앱을 이제 빌드하고 실행해보세요. 올바르게 미리보기가 나타나는 것을 확인할 수 있습니다.

사진 찍기 구현

activity_main.xml 에 다음과 같이 사진을 찍기 위한 버튼을 추가합니다.

사진을 찍기위해 startCamera()메소드를 조금 수정해보도록 하겠습니다.

다시 빌드 하고 실행하여 사진이 잘 찍히는지 확인해보세요.

이미지 프로세싱 구현하기

CameraX의 매우 흥미로운 기능은 ImageAnalysis 클래스입니다. 들어오는 카메라 프레임과 함께 호출 될 ImageAnalysis.Analyzer 인터페이스를 구현할 수 있습니다. 카메라 세션 상태를 관리하거나 이미지를 폐기하는 것에 대해 걱정할 필요가 없습니다. 

이 예제에서는 이미지의 휘도를 분석하는 커스텀 Analyzer를 만들어보도록 하겠습니다.

위와 같이 ImageAnaysis.Analyzer 인터페이스를 구현한 LuminosityAnlyzer를 만들었습니다. 이제 LuminosityAnalyzer를 인스턴스화 하여 startCamera()에 포함시키면 됩니다.

이제 다시 빌드 후 실행을 하면 로그에 휘도가 약 1초마다 찍히는것을 확인할 수 있습니다.

전체 소스코드는 github에서 확인 가능합니다.

Buy me a coffeeBuy me a coffee

답글 남기기

이메일은 공개되지 않습니다.