728x90
안녕하세요.
오늘은 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
https://github.com/ujizin/Camposer/tree/main/sample
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] View Model에서 안드로이드 문자열 관리하기 (0) | 2023.02.06 |
---|---|
[Kotlin][Android] StartActivityForResult 대신 RegisterActivityForResult 사용하기 (0) | 2023.01.17 |
[Kotlin][Android] Splash Screen(로딩 화면) 구현하기 (2) | 2022.12.23 |
[Kotlin][Android] Jetpack Compose로 진행중 애니메이션 만들어보기 (0) | 2022.12.18 |
[Kotlin] onBackPressed() deprecated , 대체할 메서드는? (0) | 2022.12.12 |