Home 안드로이드 권한 없이 이미지, 동영상 가져오기
Post
Cancel

안드로이드 권한 없이 이미지, 동영상 가져오기

안드로이드 앱 개발을 하다보면 해당 기기에 있는 이미지나 동영상을 가져오고 싶을 때가 있는데 이번 글에서 이러한 기능을 권한 없이 구현하는 방법을 짧고 간단히 알아보겠다

구현 방법

아래 코드들은 두 방법에서 공통으로 사용 될 코드이다

공통 코드

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/open_file_button"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:textSize="18sp"
        android:text="파일 열기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</androidx.constraintlayout.widget.ConstraintLayout>

간단히 로직을 보여줄 버튼 하나로 구성하였으니 실제로 사용할 때는 상황에 맞게 구성하길 바란다

getFileNameFromUri

1
2
3
4
5
6
7
8
9
10
11
12
13
private fun getFileNameFromUri(context: Context, uri: Uri): String? {
    var fileName: String? = null
    val cursor = context.contentResolver.query(uri, null, null, null, null)

    cursor?.use {
        val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        if (nameIndex != -1 && cursor.moveToFirst()) {
            fileName = cursor.getString(nameIndex)
        }
    }

    return fileName
}

Uri를 통해 파일 이름을 가져오는 함수이다 파일을 잘 불러왔나 확인 용으로 사용한 함수이다

viewBinding

중요한 건 아니지만 해당 코드에서 findViewById 대신 viewBinding을 이용했다

registerForActivityResult 선언

1
2
3
4
5
6
val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->
    if (uri != null) {
        val fileName = getFileNameFromUri(this, uri)
        Toast.makeText(this@MainActivity, fileName, Toast.LENGTH_SHORT).show()
    }
}

우선 이미지를 선택하고 할 행동인 registerForActivityResult를 선언해주면 되는데 이번 예제에서는 uri를 바탕으로 fileName을 출력하는 예제로 작성했다

2. registerForActivityResult 실행

그 다음 pickMedia를 launch 해주면 되는데 여기서 다양한 옵션이 있다

이미지, 비디오

1
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

이미지

1
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))

비디오

1
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))

mime타입

1
2
val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))

이 중에서 원한 옵션으로 실행하면 된다

마치며

마치며 마지막에서 등장한 “image/gif” 같은 문자들은 MIME 타입이라고 부르며 자세한 설명은 여기를 참고하자

This post is licensed under CC BY 4.0 by the author.