[Android][Kotlin] 이미지 불러오기 - registerForActivityResult, coil
Notepad96
·2022. 4. 30. 02:09
1. 결과
# 이 글은 저장소의 저장되어 있는 이미지 파일을 불러와 이미지 뷰의 표시하는 방법에 관하여 기술한다.
2. 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_file_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#3BEF92"
android:textAllCaps="false"
android:textSize="22sp"
android:textColor="@color/black"
android:text="Image File Load"/>
<ImageView
android:id="@+id/img_load"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
# 레이아웃은 이미지 파일을 불러올 수 있도록 버튼 1개와 이미지를 보여줄 이미지뷰 1개로 구성하였다.
3. 코드
package com.example.imageloadfile
import android.Manifest
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import coil.load
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val permissionList = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
private val checkPermission = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
result.forEach {
if(!it.value) {
Toast.makeText(applicationContext, "권한 동의 필요!", Toast.LENGTH_SHORT).show()
finish()
}
}
}
private val readImage = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
img_load.load(uri)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkPermission.launch(permissionList)
btn_file_img.setOnClickListener {
readImage.launch("image/*")
}
}
}
1. 권한을 얻기 위하여 permissionList와 checkPermission을 정의한다.
registerForActivityResult를 사용하여 권한을 얻는 방법에 자세한 사항은 이전 글 참고하면 된다.
2. 이미지를 불러오기 위하여 권한을 얻을 때와 마찬가지로 registerForActivityResult를 사용하여 readImage를 정의하였으며 대신 권한을 얻을 때와는 다르게 인수로 ActivityResultContracts.GetContent()를 사용한다.
해당 예시에서는 Kotlin 이미지 로딩 라이브러리 중 하나인 Coil을 사용하였으며 따라서 이미지 뷰 객체의 load 함수를 사용함으로써 간단하게 이미지 뷰의 이미지를 보여줄 수 있다.
Coil 라이브러리의 관한 자세한 내용은 이전 글 참고하면 된다.
3. 이제 onCreate에서 위에서 정의한 객체들을 사용하여서 권한을 요청하고 버튼을 클릭하였을 시 이미지를 불러와 표시할 수 있도록 코드를 작성한다.
# checkpermission.launch(permissionList)
: 권한을 요청. 위에서 정의한 checkpermission에 따라 동작 결정. 요청하고자 하는 권한들이 담긴 배열인 premissionList를 인수로 준다.
# readImage.launch("image/*")
: 사실 위에서 정의한 getContent는 저장소의 있는 파일 아무거나 Get 하는 동작을 위한 것이다.
하지만 launch 인수로 "image/*"를 줌으로써 저장소의 있는 파일 중 이미지 파일만을 Get 할 수 있도록 제한하여서 이미지 파일만을 불러올 수 있도록 구현할 수 있다.
'Android' 카테고리의 다른 글
[Android/Kotlin] Recyclerview List Animation(리스트 애니메이션) (1) | 2022.08.16 |
---|---|
[Android/Kotlin] 카메라로 찍은 후 Image 불러오기 (Image 파일 저장) (0) | 2022.08.15 |
Android Kotlin coil - 이미지 로딩 라이브러리 (0) | 2022.04.28 |
Android Kotlin Permission - registerForActivityResult (0) | 2022.04.26 |
Android Kotlin Image Full Screen - 이미지 클릭 시 확대 (0) | 2022.02.22 |