[kotlin] 코틀린 데이터 바인딩을 사용하여 사진 찍기 및 저장하는 방법

안녕하세요! 이번에는 코틀린 데이터 바인딩을 사용하여 안드로이드 앱에서 사진을 찍고 저장하는 방법에 대해 알아보겠습니다.

필요한 라이브러리 및 권한

먼저, 카메라와 사진을 다루기 위해 CameraX 라이브러리를 사용합니다. CameraX 라이브러리의 최신 버전은 여기에서 확인할 수 있습니다. 또한, 사진을 저장하기 위해 외부 저장소 쓰기 권한이 필요합니다.

// build.gradle (Module: app)에 CameraX 의존성 추가
dependencies {
    implementation "androidx.camera:camera-camera2:latest-version"
    implementation "androidx.camera:camera-lifecycle:latest-version"
    implementation "androidx.camera:camera-view:latest-version"
}

// AndroidManifest.xml에 외부 저장소 쓰기 권한 추가
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

XML 레이아웃에 데이터 바인딩 설정하기

다음으로, 카메라 미리보기와 버튼을 담은 XML 레이아웃을 생성하고 데이터 바인딩을 설정합니다.

<!-- activity_main.xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="com.example.cameraapp.CameraViewModel" />
    </data>
    <LinearLayout
        ...>
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView"
            ... />
        <Button
            android:id="@+id/captureButton"
            android:onClick="@{() -> viewModel.capturePhoto()}"
            ... />
    </LinearLayout>
</layout>

ViewModel 및 데이터 바인딩 설정하기

이제 XML 레이아웃에 설정한 변수를 이용하여 ViewModel과 데이터 바인딩을 설정합니다.

// CameraViewModel.kt
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.ViewModel

class CameraViewModel : ViewModel() {
    fun capturePhoto() {
        // 사진 촬영 및 저장 로직 작성
    }
}
// MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.cameraapp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.viewModel = ViewModelProvider(this).get(CameraViewModel::class.java)
        binding.lifecycleOwner = this
    }
}

사진 촬영 및 저장 로직 작성하기

마지막으로, ViewModel에서 실제로 사진을 촬영하고 저장하는 로직을 작성합니다.

// CameraViewModel.kt
fun capturePhoto() {
    val imageCapture = ImageCapture.Builder().build()
    val outputFile = File(getOutputDirectory(), "photo.jpg")
    
    imageCapture.takePicture(outputFile, executor, object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(file: File) {
            // 사진 저장 성공
        }

        override fun onError(imageCaptureError: ImageCaptureException) {
            // 에러 처리
        }
    })
}

private fun getOutputDirectory(): File {
    val mediaDir = externalMediaDirs.firstOrNull()?.let {
        File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
    }
    return if (mediaDir != null && mediaDir.exists()) mediaDir else filesDir
}

이제 코틀린 데이터 바인딩과 CameraX를 사용하여 안드로이드 앱에서 사진을 찍고 저장하는 기능을 구현할 수 있습니다.

더 자세한 내용은 CameraX 공식 문서를 참고하시기 바랍니다.