지난 게시글에서 앱 내의 녹음 파일을 외부저장소(내장 메모리 > Music)로 이동시키는 것을 했는데요.
그것에 이어, 이동시킨 저장소의 파일 목록을 표시하달라는 요구사항이 있었습니다.
아래는 지난 게시글입니다. 필요하신 분은 참고하세요.^^
이번 개발의 핵심 포인트는 특정 저장소(내장 메모리 > Music)의 파일 목록을 최신순으로 불러오는 기능입니다.
이제 개발을 시작해보겠습니다.
1. 쿼리 파라메터 projection 생성
val projection = arrayOf(
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.MIME_TYPE,
MediaStore.Audio.Media.DURATION
)
필요한 데이터를 정의합니다.
오디오 파일 목록이기때문에 파일명, 파일 타입, 재생 시간 데이터를 정의했습니다.
2. 쿼리 파라메터 selection과 sort
val selection = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Audio.Media.RELATIVE_PATH + " like ? "
} else null
val selectionArgs = arrayOf("%Music%")
val sortOrder = MediaStore.MediaColumns.DATE_ADDED + " COLLATE NOCASE DESC"
오늘 글의 핵심 내용이 벌써 나왔네요.ㅎ
외부저장소 Music 폴더에 저장시에 RELATIVE_PATH에 Music이라고 저장을 했을 것입니다.
따라서, 이를 "Music" 키워드로 필터링(like 검색)하여 해당하는 데이터만 불러옵니다.
다음으로 최신순 정렬입니다. insert된 시간을 기준으로 DESC 순으로 정렬하도록 합니다.
3. 오디오 파일 Query 하기
context.contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
)?.use { cursor ->
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
val displayNameColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)
val mimeTypeColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE)
val durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)
while (cursor.moveToNext()) {
val id = cursor.getLong(idColumn)
val displayName = cursor.getString(displayNameColumn)
val contentUri = Uri.withAppendedPath(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
id.toString()
)
val mineType = cursor.getString(mimeTypeColumn)
val duration = cursor.getLong(durationColumn)
}
cursor.close()
}
위의 생성한 값들을 contentResolver.query()의 파라메터로 넣고, 쿼리 요청을 합니다.
이후엔 cursor를 받아 cursor.moveToNext()가 false가 나올때까지 while을 돌면서 데이터를 가져오면 됩니다.
작은 팁으로 cursor.getColumnIndexOrThrow() 는 while 내에서 수행하면 동일한 작업을 반복적으로 수행하게 되므로, while 전에 값을 가지고 있는게 좋습니다.
cursor를 통해 가져온 값들은 각자 알아서 array에 넣어서 사용하면 되겠습니다.
그럼, 오늘도 존버!!
'Android + Kotlin' 카테고리의 다른 글
[Android + Kotlin] Notification Trampolines 이슈 해결하기 (0) | 2023.02.24 |
---|---|
[Android + Kotlin] TextView에 <a> tag URL링크 적용하기 (0) | 2023.02.22 |
[Android+Kotlin] 외부저장소에 파일 저장하기(Android Q 이상) (0) | 2023.02.09 |
[Android+Kotlin] Logcat 로그 전체 보기 팁 (잘림현상 극복~) (0) | 2023.01.16 |
Linkify 에서 WEB_URL 패턴을 커스텀해보자. (0) | 2023.01.15 |