[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 공식 문서를 참고하시기 바랍니다.