Android Kotlin Camera - 사진 찍고 불러오기

Notepad96

·

2022. 2. 3. 23:41

300x250

 

 


1. 결 과

결 과

 

# 이 글은 카메라의 기본적인 내용으로서 카메라를 오픈하여 찍은 사진을 불러오는 방법을 기술한다.

 

 

 


2. activity_main.xml & AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/main_btn_camera_open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Camera Open"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.057" />

    <ImageView
        android:id="@+id/main_img_photo"
        android:layout_width="400dp"
        android:layout_height="400dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/main_btn_camera_open" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

# 레이아웃은 카메라를 호출하는 Button 하나와 찍은 사진을 보여줄 ImageView 하나로 구성한다.

 

 

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cameraexample">

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

    <uses-feature android:name="android.hardware.camera" android:required="true" />
    
    .....

 

# 카메라를 호출하기 위하여 권한을 추가해준다.

 

 


3. MainActivity.kt

package com.example.cameraexample

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    val REQUEST_IMAGE_CAPTURE = 1

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

        main_btn_camera_open.setOnClickListener {

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
                takePictureIntent.resolveActivity(packageManager)?.also {
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
                }
            }
        }
    }

    private fun checkPermission() {
        var permission = mutableMapOf<String, String>()
        permission["camera"] = Manifest.permission.CAMERA
//        permission["storageRead"] = Manifest.permission.READ_EXTERNAL_STORAGE
//        permission["storageWrite"] =  Manifest.permission.WRITE_EXTERNAL_STORAGE

        var denied = permission.count { ContextCompat.checkSelfPermission(this, it.value)  == PackageManager.PERMISSION_DENIED }

        if(denied > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            requestPermissions(permission.values.toTypedArray(), REQUEST_IMAGE_CAPTURE)
        }

    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(requestCode == REQUEST_IMAGE_CAPTURE) {
            var count = grantResults.count { it == PackageManager.PERMISSION_DENIED }

            if(count != 0) {
                Toast.makeText(applicationContext, "권한을 동의해주세요.", Toast.LENGTH_SHORT).show()
                finish()
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            val imageBitmap = data?.extras?.get("data") as Bitmap

            main_img_photo.setImageBitmap(imageBitmap)
        }
    }
}

 

# checkPermission 및 onRequestPermissionsResult는 권한의 관련된 내용으로서 자세한 내용은 아래 글 참조

 

 

 

# startActivityForResult()는 앱이 처리할 수 없는 인텐트를 사용하면 앱이 비정상 종료가되기 때문에 resolveActivity()를 호출함으로써 확인 절차를 갖음으로써 안전하게 사용할 수 있다.

 

 

# 사진을 찍은 후 확인을 클릭하면 다시 애플리케이션으로 돌아오면서 onActivityResult가 실행된다.

 

사진을 찍은 후 확인을 눌렀기 때문에 resultCode가 RESULT_OK이며, data를 읽어 Bitmap으로 변환 후 imageView를 통하여 확인 할 수 있다.

 

 


4. 전체 코드 & 참고 자료

 

 

사진 촬영  |  Android 개발자  |  Android Developers

이 과정에서는 기존 카메라 애플리케이션을 사용하여 사진을 캡처하는 방법을 설명합니다. 클라이언트 앱을 실행하는 기기에서 촬영한 하늘 사진을 조합하여 세계 날씨 지도를 만드는 크라우

developer.android.com

 

 

GitHub - Notepad96/BlogExample

Contribute to Notepad96/BlogExample development by creating an account on GitHub.

github.com

 

 

300x250