본문 바로가기
안드로이드 코틀린

[Kotlin][Android] Camposer: Jetpack Compose 카메라 라이브러리 사용하기

by teamnova 2023. 1. 5.

안녕하세요.

오늘은 Jetpack Compose 사용 시 쓸 수 있는 카메라 라이브러리 Camposer를 프로젝트에 구현하는 방법을 알아보겠습니다.

 

Set up

먼저, 최신 버전dependency를 build.gradle (module)에 추가해줍니다.

 

dependencies {
  implementation("io.github.ujizin:camposer:<version>")
}

 

작동방법

CameraPreview를 UI에 위치시킵니다.

@Composable
fun CameraUI(modifier: Modifier = Modifier) {
    val cameraState = rememberCameraState()
    CameraPreview(
        modifier = modifier,
        cameraState = cameraState,
    )
}
  • CameraPreview : 카메라 미리보기를 위치시키는 composable 함수입니다.
  • CameraState : 미리보기에는 필요하지 않지만, 사진 촬영, 동영상 녹화 등의 작업과 내부 상태(플래시 및 image analyzer)에는 필요합니다.

 

카메라 전환

카메라 전환을 위해서 아래와 같이  'CamSelector.Back' 또는 'CamSelector.Front'를 사용합니다. 

@Composable
fun CameraUI(modifier: Modifier) {
  val cameraState = rememberCameraState()
  var camSelector by remember { mutableStateOf(CamSelector.Back) }
  CameraPreview(
    modifier = modifier,
    cameraState = cameraState,
    camSelector = camSelector,
  ) {
    Button(onClick = { camSelector = camSelector.inverse }) { Text("Switch camera") }
  }
}

 

사진 촬영

CameraState를 사용하고 takePicture 메소드를 호출하면 됩니다.

// 새 파일을 만들기 위한 함수 
private fun Context.createNewFile() = File(
    filesDir, "${System.currentTimeMillis()}.jpg"
).apply { createNewFile() }

@Composable
fun CameraUI(modifier: Modifier) {
  val cameraState = rememberCameraState()
  val context = LocalContext.current
  CameraPreview(
    cameraState = cameraState,
  ) {
    Button(onClick = {
       cameraState.takePicture(context.createNewFile()) { result -> 
          // Result는 사진이 성공적으로 저장되었는지 여부를 알려줌
       }
    }) {  Text("Take Picture") }
  }
}

 

동영상 촬영

사진촬영과 유사합니다. 이를 위해 CaptureMode.Video를 캡쳐모드로 변경하고,

녹화 중지를 위해 toggleRecording를 두 번 호출해야 합니다. 

ps. startRecording 과 stopRecording을 별도로 사용할 수도 있습니다. 

// mp4 형식의 새 파일 생성하는 함수
private fun Context.createNewFile() = File(
    filesDir, "${System.currentTimeMillis()}.mp4"
).apply { createNewFile() }

@Composable
fun CameraUI(modifier: Modifier) {
  val cameraState = rememberCameraState()
  val context = LocalContext.current
  CameraPreview(
    modifier = modifier,
    cameraState = cameraState,
    captureMode = CaptureMode.Video,
  ) {
    Button(onClick = { 
      // toggleRecording = startRecording + stopRecording (분리해서 사용할 수도 있음)
      // Record video also accepts ContentValues & OutputFileOptions!
      cameraState.toggleRecording(context.createNewFile("mp4")) { result ->
         // Result는 녹화된 비디오 파일 또는 오류를 반환
      } 
    }) { Text("Record video") }
  }
}

 

그 외 기능 

 Camposer Wiki 에서 더 다양한 기능을 확인할 수 있습니다. 

 

 

sample projects 

https://github.com/ujizin/camera-compose

 

GitHub - ujizin/camera-compose: Camera using Jetpack Compose with no interoperability (Camposer) 📸

Camera using Jetpack Compose with no interoperability (Camposer) 📸 - GitHub - ujizin/camera-compose: Camera using Jetpack Compose with no interoperability (Camposer) 📸

github.com

https://github.com/ujizin/Camposer/tree/main/sample

 

GitHub - ujizin/Camposer: Camera Library for Android Jetpack Compose. 📸✨

Camera Library for Android Jetpack Compose. 📸✨. Contribute to ujizin/Camposer development by creating an account on GitHub.

github.com