MediaStore에서 미디어 파일 정보 읽는 방법
Media Provider와 MediaStore라는 용어에 대해 알아야 한다.
- Media Provider
단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더 입니다.
이 프로바이더에게 찾고 싶은 종류의 데이터를 쿼리할 수 있습니다. - Media Store
앱이 Media Provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다.
쿼리에 필요한 데이터들이 정의되어 있습니다.
따라서, 우리는 MediaStore의 API들이 어떤 의미인지 이해하고, 그 API를 통해 Media Provider에 쿼리를 하여 데이터를 얻으면 됩니다.
Android 10(Q)이상 Scoped Storage 부분은 다루지 않겠습니다.
권한
MediaStore에서 파일을 읽으려면 READ권한이 필요합니다. (READ_EXTERNAL_STORAGE)
이미지 쿼리
MediaStore로 디바이스에 있는 이미지들을 쿼리하는 코드는 다음과 같습니다.
//간혹 MediaStore.Images부분을 다르게 할 때가 있음 잘 확인 하기(Video등등)
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA_TAKEN
)
val selection = "${MediaStore.Images.Media.DATE_TAKEN} >= ?"
//dateToTimestamp는 SimpleDateFormat으로 가져온 dateformat이다.
val selectionArgs = arrayOf(
dateToTimestamp(day =1, month = 1, year = 1970).toString()
)
val sortOrder = "${MediaStore.Images.Media.DATE_TAKEN} DESC"
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
)
query각각 인자의 의미
- Uri: 찾고자 하는 데이터의 Uri
- Projection: DB의 column과 같습니다. 결과로 받고 싶은 데이터의 종류
- Selection: DB의 where 키워드와 같습니다. 조건으로 필터링된 결과를 받을 때 사용
- Selection args: Selection과 함께 사용
- Sort order: 쿼리 결과 데이터를 sort
결과
위의 조건으로 쿼리한 데이터가 있다면 Cursor로 결과를 순회(Loop)할 수 있습니다.
cursor?.use {
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
val dateTakenCoumn = 생략
val displayNameColumn = 생략
while(cursor.moveToNext()) {
val id = cursor.getLong(idColumn)
val dateTaken = 생략
val displayName = 생략
val contentUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id.toString())
}
}
Column의 리턴 타입에 맞게 API를 사용하면 된다.
출처:
https://codechacha.com/ko/android-mediastore-read-media-files/
'안드로이드' 카테고리의 다른 글
[Android] AudioFocus 관리, MediaPlayer, AudioManager (0) | 2024.03.20 |
---|---|
[Android] DiffUtil에 대해 알아보자 (0) | 2024.03.20 |
Android Q 파일 삭제 ScopeStorage 삽질 (2) | 2024.03.20 |
[Android] FCM을 사용해서 메시지를 보내는 과정 (FCM 추가) (0) | 2024.03.19 |
[Android] Exoplayer란? (0) | 2024.03.18 |