안드로이드 앱 개발을 하다보면 해당 기기에 있는 이미지나 동영상을 가져오고 싶을 때가 있는데 이번 글에서 이러한 기능을 권한 없이 구현하는 방법을 짧고 간단히 알아보겠다
구현 방법
아래 코드들은 두 방법에서 공통으로 사용 될 코드이다
공통 코드
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 타입이라고 부르며 자세한 설명은 여기를 참고하자