본문 바로가기
프로그래밍/Android

안드로이드 Camera2 간단한 카메라 애플리케이션 만들기

by makepluscode 2023. 12. 16.
반응형

안드로이드 Camera2 간단한 카메라 애플리케이션 만들기

Camera2 API는 안드로이드 5.0 (롤리팝)에서 처음 소개되었습니다. 이전 버전의 안드로이드에서는 Camera API (현재는 Camera1 API로 불림)를 사용했었는데, 이는 사용하기 쉽지만 기능이 제한적이었습니다. Camera2 API는 이러한 제한을 극복하고 더욱 강력하고 유연한 카메라 기능을 제공하기 위해 개발되었습니다. Camera2 API는 프로 카메라 애플리케이션과 같이 더 세부적인 카메라 제어가 필요한 경우에 적합합니다. 이 API를 통해 개발자들은 노출, 초점, 프레임 속도 등 카메라의 다양한 설정을 정밀하게 제어할 수 있습니다.

안드로이드 Camera2 간단한 카메라 애플리케이션 만들기

Camera2 프레임워크의 특징

  • 고급 카메라 제어: 사용자는 ISO, 셔터 속도, 노출 등을 정밀하게 제어할 수 있습니다.
  • 다양한 이미지 처리: RAW 이미지 캡처를 포함한 고급 이미지 처리 기능을 제공합니다.
  • 유연한 카메라 파이프라인: 다양한 카메라 기능과 효과를 위한 강력한 파이프라인을 제공합니다.

Camera2 를 사용한 카메라 어플리케이션 구현 방법은?

이 예제 코드는 안드로이드의 Camera2 API를 활용하여 카메라 기능을 구현하는 방식을 설명합니다. 아래 이미지는 삼성 갤럭시 (Android 12) 기기에서 이 예제를 실행했을 때의 화면입니다. 화면에는 카메라 프리뷰와 사진 촬영을 위한 버튼이 표시되며, 사진을 촬영하면 Toast 메시지를 통해 사진의 저장 위치가 사용자에게 안내됩니다.

Camera2 를 사용한 카메라 어플리케이션

Camera 클래스는 카메라 연결, 프리뷰, 이미지 캡처 등을 관리하며, FileHelper 클래스는 이미지 파일을 저장하는 역할을 합니다. MainActivity 클래스는 애플리케이션의 메인 화면을 관리하고 카메라 권한을 처리합니다. 전체 코드는 아래 makspluscode github 를 참고 하세요.

https://github.com/makepluscode/android-camera2-example1?tab=readme-ov-file

1. Camera 클래스

이 클래스는 카메라 디바이스의 연결, 프리뷰 시작, 이미지 캡처 등의 기능을 담당합니다.

타입 맴버 이름 (반환) 타입 설명
맴버변수 mContext Context 시스템 서비스에 접근하기 위한 컨텍스트
맴버변수 mCameraDevice CameraDevice 카메라 디바이스를 나타냄
맴버변수 mPreviewBuilder CaptureRequest.Builder 카메라 프리뷰 요청을 구성하는 빌더
맴버변수 mPreviewSession CameraCaptureSession 카메라 프리뷰 세션
맴버변수 mTextureView TextureView 카메라 프리뷰를 표시하는 뷰
맴버변수 mCameraCaptureButton Button 이미지 캡처를 위한 버튼
맴버변수 mFileHelper FileHelper 파일 저장을 위한 헬퍼 클래스
맴버변수 mPreviewSize Size 프리뷰 크기
맴버변수 mCameraOpenCloseLock Semaphore 카메라 열고 닫는 것을 제어하는 세마포어
맴버함수 Camera(Context, TextureView, Button) - 생성자
맴버함수 openCamera() void 카메라를 설정하고 연결하는 메소드
맴버함수 setSurfaceTextureListener() void TextureView에 리스너를 설정하는 메소드
맴버함수 onResume() void 액티비티 재개시 카메라 프리뷰를 재시작하는 메소드
맴버함수 onPause() void 액티비티 일시정지시 카메라를 닫는 메소드
맴버함수 setupCamera() void 카메라 설정을 구성하는 메소드
맴버함수 connectCamera() void 카메라 디바이스에 연결하는 메소드
맴버함수 startPreview() void 카메라 프리뷰를 시작하는 메소드
맴버함수 updatePreview() void 프리뷰를 업데이트하는 메소드
맴버함수 captureImage() void 이미지를 캡처하는 메소드
맴버함수 printCameraCaptureDetails(Image) void 캡처된 이미지의 세부 정보를 로그에 출력하는 메소드
맴버함수 saveImage(byte[]) void 이미지를 저장하는 메소드
맴버함수 showToast(String) void 토스트 메시지를 표시하는 메소드

2. FileHelper 클래스

이 클래스는 이미지 파일을 저장하는 기능을 담당합니다.

타입 맴버 이름 타입 설명
맴버변수 mContext Context 컨텍스트
맴버함수 FileHelper(Context) - 생성자
맴버함수 saveImage(byte[]) String 이미지를 저장하고 파일 경로를 반환하는 메소드

3. MainActivity 클래스

애플리케이션의 메인 화면을 관리합니다. 카메라 권한 요청 및 카메라 초기화 등을 담당합니다.

타입 맴버 이름 타입 설명
맴버변수 mCamera Camera Camera 클래스의 인스턴스
맴버함수 맴버함수 onCreate(Bundle) void
맴버함수 onRequestPermissionsResult(int, String[], int[]) void 권한 요청 결과를 처리하는 메소드
맴버함수 onResume() void 액티비티 재개시 호출되는 메소드
맴버함수 onPause() void 액티비티 일시정지시 호출되는 메소드
맴버함수 initializeComponents() void UI 컴포넌트를 초기화하는 메소드
맴버함수 hasRequiredPermissions() boolean 필요한 권한이 있는지 확인하는 메소드
맴버함수 requestNecessaryPermissions() void 필요한 권한을 요청하는 메소드

전체코드

이상으로 안드로이드 카메라 애플리케이션의 기본 구조와 각 클래스의 역할에 대해 알아보고 간단한 example 를 만들어보았습니다. 전체 코드는 아래 makspluscode github 를 참고 하세요.

https://github.com/makepluscode/android-camera2-example1?tab=readme-ov-file

반응형