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

[Kotlin][Android] 카메라 기능 이용해서 이미지 받아오기

by teamnova 2023. 12. 2.

안녕하세요! 이번 포스트에서는 안드로이드 앱에서 카메라를 사용하여 사진을 찍고 표시하는 간단한 예제를 Kotlin으로 작성해 보겠습니다.

 

1. 프로젝트 설정

 

먼저 , AndroidManifest.xml 파일에 카메라 및 외부저장소에 대한 권한을 추가합니다.

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

 

2. 액티비티 및 레이아웃 설정

 

다음으로, 카메라를 사용할 액티비티를 생성하고, 해당 액티비티의 레이아웃(activity_camera.xml)에 이미지뷰(ImageView)와 버튼(Button)을 추가합니다.

activity_camera.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 이미지뷰: 카메라로 찍은 사진을 표시할 곳 -->
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:src="@drawable/placeholder_image" />

    <!-- 버튼: 카메라 열기 -->
    <Button
        android:id="@+id/openCameraButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Open Camera"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="24dp"/>
</RelativeLayout>

 

3.Kotlin 코드 작성 

이제, Kotlin 코드로 카메라를 열고 사진을 찍어 이미지 뷰에 표시하는 작업을 합니다. 

 

CameraActivity.kt

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class CameraActivity : AppCompatActivity() {

    private val REQUEST_IMAGE_CAPTURE = 101
    private val CAMERA_PERMISSION_CODE = 102

    private lateinit var imageView: ImageView
    private lateinit var openCameraButton: Button

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

        // XML 레이아웃에서 ImageView 및 Button 참조
        imageView = findViewById(R.id.imageView)
        openCameraButton = findViewById(R.id.openCameraButton)

        // 카메라 버튼 클릭 이벤트 처리
        openCameraButton.setOnClickListener {
            // 카메라 권한 확인 및 요청
            checkCameraPermission()
        }
    }

    // 카메라 권한 확인 및 요청
    private fun checkCameraPermission() {
        // 카메라 권한이 부여되었는지 확인
        if (ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.CAMERA
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // 권한이 없다면 권한 요청
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA),
                CAMERA_PERMISSION_CODE
            )
        } else {
            // 권한이 이미 허용되었다면 사진 촬영 진행
            dispatchTakePictureIntent()
        }
    }

    // 카메라로 사진 찍기
    private fun dispatchTakePictureIntent() {
        // 카메라 앱을 실행하기 위한 Intent 생성
        val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    }

    // 권한 요청 결과 처리
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        if (requestCode == CAMERA_PERMISSION_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 권한이 허용되면 사진 촬영 진행
                dispatchTakePictureIntent()
            } else {
                // 권한이 거부되었을 때 처리
                // (예: 사용자에게 권한이 필요하다는 메시지 표시)
            }
        }
    }

    // 찍은 사진 결과 표시
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            // 사진 찍기 완료 후 결과 이미지를 ImageView에 설정
            val imageBitmap = data?.extras?.get("data") as Bitmap
            imageView.setImageBitmap(imageBitmap)
        }
    }
}

 

카메라 권한 확인 및 요청 (checkCameraPermission())

앱이 카메라에 액세스 할 수 있는 권한이 있는지 확인하고, 없다면 사용자에게 권한을 요청합니다. 이는 checkCameraPermission() 함수에서 수행됩니다. 


사용자가 권한을 허용하면 

이후 dispatchTakePictureIntent() 함수를 사용하여 카메라 앱을 엽니다. 

사용자가 사진을 찍으면 onActivityResult() 함수가 호출되어 찍은 사진을 이미지뷰에 표시합니다.