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. 전체 코드 & 참고 자료
300x250
'Android' 카테고리의 다른 글
Android Kotlin Number Picker Dialog - 숫자 선택 창 (0) | 2022.02.07 |
---|---|
Android Kotlin Permission Check - 권한 요청 및 설정 (0) | 2022.02.04 |
Android Kotlin Font - 폰트 적용 (0) | 2022.02.02 |
Android Kotlin Custom Calendar - 커스텀 달력 (0) | 2022.02.01 |
Android Kotlin Chip Button (0) | 2022.01.31 |