[Android][Kotlin] 이미지 불러오기 - registerForActivityResult, coil

Notepad96

·

2022. 4. 30. 02:09

300x250

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>

 

activity_main.xml

# 레이아웃은 이미지 파일을 불러올 수 있도록 버튼 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를 사용하여 권한을 얻는 방법에 자세한 사항은 이전 글 참고하면 된다.

 

 

Android Kotlin Permission - registerForActivityResult

1. 결 과 # 이 글은 애플리케이션에서 필요한 권한을 요청하고 확인하여 권한 허용 여부의 따른 동작을 설정하는 방법을 기존과는 다르게 registerForActivityResult를 사용하여 기존보다 더욱 간단한

notepad96.tistory.com

 

 

2. 이미지를 불러오기 위하여 권한을 얻을 때와 마찬가지로 registerForActivityResult를 사용하여 readImage를 정의하였으며 대신 권한을 얻을 때와는 다르게 인수로 ActivityResultContracts.GetContent()를 사용한다.

 

해당 예시에서는 Kotlin 이미지 로딩 라이브러리 중 하나인 Coil을 사용하였으며 따라서 이미지 뷰 객체의 load 함수를 사용함으로써 간단하게 이미지 뷰의 이미지를 보여줄 수 있다.

 

Coil 라이브러리의 관한 자세한 내용은 이전 글 참고하면 된다.

 

 

Android Kotlin coil - 이미지 로딩 라이브러리

1. 결 과 # 이 글은 Android서 사용 가능한 이미지 로딩 라이브러리 중 하나인 Coil에 대하여 기술한다. Coil은 Kotlin Coroutines으로 만들어진 Android 백앤드 이미지 로딩 라이브러리입니다. Coil 은: 빠르다

notepad96.tistory.com

 

 

 

3. 이제 onCreate에서 위에서 정의한 객체들을 사용하여서 권한을 요청하고 버튼을 클릭하였을 시 이미지를 불러와 표시할 수 있도록 코드를 작성한다.

 

# checkpermission.launch(permissionList)

: 권한을 요청. 위에서 정의한 checkpermission에 따라 동작 결정. 요청하고자 하는 권한들이 담긴 배열인 premissionList를 인수로 준다.

 

# readImage.launch("image/*")

: 사실 위에서 정의한 getContent는 저장소의 있는 파일 아무거나 Get 하는 동작을 위한 것이다.

하지만 launch 인수로 "image/*"를 줌으로써 저장소의 있는 파일 중 이미지 파일만을 Get 할 수 있도록 제한하여서 이미지 파일만을 불러올 수 있도록 구현할 수 있다.

 

 

 

300x250