코틀린 안드로이드 앱개발 강좌, 카메라, 갤러리 앱과 연동하는 앱 만들기

카메라와 갤러리 앱 연동 앱 만들기

이번 강좌에서는 Kotlin을 활용하여 Android 앱에서 카메라와 갤러리를 연동하는 방법에 대해 자세히 설명하겠습니다.
카메라를 통해 사진을 찍고, 갤러리에서 이미지를 선택할 수 있는 두 가지 기능을 구현할 것입니다.
최종적으로 이러한 기술을 사용하여 사용자가 사진을 찍거나 선택하면 해당 이미지를 화면에 표시하는 간단한 앱을 개발할 것입니다.

목차

사전 준비 사항

본 강좌를 진행하기 위해서는 다음과 같은 준비 사항이 필요합니다.

  • Android Studio 최신 버전 설치
  • Kotlin 언어에 대한 기본 지식
  • Android 기본 앱 개발 경험

앱 설정 및 권한 요청

첫 번째 단계는 Android 프로젝트를 생성하고 필요한 권한 요청을 설정하는 것입니다.
Android Studio에서 새로운 프로젝트를 생성하고 ‘Empty Activity’ 템플릿을 선택합니다.

1. Gradle 설정

build.gradle (Module: app) 파일에 다음 의존성을 추가하여, 카메라와 갤러리 기능을 사용할 수 있도록 합니다.

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.activity:activity-ktx:1.2.2'
    implementation 'com.google.android.material:material:1.4.0'
}

2. AndroidManifest.xml에 권한 추가

카메라와 갤러리에 접근하기 위해 필요한 권한을 AndroidManifest.xml 파일에 추가합니다.

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3. 권한 요청

Android 6.0 (API 23) 이상에서는 런타임 중에 사용자에게 권한을 요청해야 합니다.
다음 코드를 MainActivity.kt 파일에 추가하여 권한을 요청합니다.

class MainActivity : AppCompatActivity() {
    private val REQUEST_CODE_PERMISSIONS = 10
    private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (!allPermissionsGranted()) {
            ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
        }
    }

    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        if (requestCode == REQUEST_CODE_PERMISSIONS) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 권한이 허용됨
            } else {
                // 권한이 거부됨
                Toast.makeText(this, "권한이 필요합니다.", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

카메라에서 사진 찍기

사용자가 카메라를 통해 사진을 찍을 수 있는 기능을 구현해보겠습니다.
이 과정에서 사진을 찍은 결과를 앱에 표시하는 방법도 확인합니다.

1. 카메라 인텐트 설정

다음 코드를 사용하여 카메라 인텐트를 실행하는 함수를 작성합니다.
이때, 인텐트에서 생성된 URI를 사용하여 찍은 사진의 경로를 저장합니다.

private lateinit var photoUri: Uri

private fun openCamera() {
    val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    photoUri = FileProvider.getUriForFile(this, "${BuildConfig.APPLICATION_ID}.fileprovider", createImageFile())
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
    startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE)
}

private fun createImageFile(): File {
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!
    return File.createTempFile("JPEG_${timeStamp}_", ".jpg", storageDir).apply {
        // 이곳에서 파일 경로를 반환합니다.
        currentPhotoPath = absolutePath
    }
}

2. 사진 촬영 결과 처리

onActivityResult 메서드를 오버라이드하여 찍은 사진의 URI를 처리합니다.
이 URI를 사용하여 이미지를 ImageView에 표시합니다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        val bitmap = BitmapFactory.decodeFile(currentPhotoPath)
        imageView.setImageBitmap(bitmap)
    }
}

이제는 갤러리에서 이미지를 선택할 수 있는 기능을 추가합니다.
이 기능 또한 인텐트를 통해 쉽게 구현할 수 있습니다.

1. 갤러리 인텐트 설정

사용자가 갤러리에서 이미지를 선택할 수 있도록 하는 함수를 작성합니다.

private fun openGallery() {
    val galleryIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    startActivityForResult(galleryIntent, REQUEST_IMAGE_PICK)
}

2. 선택한 이미지를 처리하는 메서드

사용자가 선택한 이미지의 URI를 받아서 해당 이미지를 ImageView에 표시합니다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        REQUEST_IMAGE_PICK -> {
            if (resultCode == Activity.RESULT_OK) {
                data?.data?.let { uri ->
                    imageView.setImageURI(uri)
                }
            }
        }
        // 이전의 코드...
    }
}

결론

이번 강좌를 통해 카메라와 갤러리를 연동하여 이미지를 찍고 선택할 수 있는 안드로이드 애플리케이션을 만드는 방법에 대해 알아보았습니다.
Kotlin의 강력한 기능과 Android의 다양한 API를 통해 복잡한 작업을 간단히 처리할 수 있음을 보여주었습니다.

이 guide를 바탕으로 자신만의 기능을 추가해 보는 것도 좋은 학습이 될 것입니다.
감사합니다!