마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드13 contentresolve 동영상

0 추천
    private fun getVideos(limit: Int , offset: Int): MutableList<PickerImageInfo> {
        val photos = mutableListOf<PickerImageInfo>()

        val projection = arrayOf(MediaStore.Video.VideoColumns._ID,
            MediaStore.Video.VideoColumns.BUCKET_DISPLAY_NAME,
            MediaStore.Video.VideoColumns.BUCKET_ID,
            MediaStore.Video.VideoColumns.MIME_TYPE,
            MediaStore.Video.VideoColumns.DATE_TAKEN,
            MediaStore.Video.VideoColumns.SIZE)

        val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
        val order = MediaStore.Video.VideoColumns.DATE_TAKEN
//        val sortOrder = "$order DESC LIMIT $limit OFFSET $offset"
        val sortOrder = "$order DESC"

        val videoCursor: Cursor?

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val sortArgs = arrayOf(order)

            val queryArgs = bundleOf(
                ContentResolver.QUERY_ARG_SORT_COLUMNS to sortArgs,
                ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
            )

            if(bucketId != "0") {
                queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, defaultVideoSelection)
                queryArgs.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, defaultSelectionArgs)
            }


            videoCursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                projection,
                queryArgs,
                null)
        } 
       ...
    }

안드로이드13에서만 동영상을 못가져오는데 뭐가 문제일까요?
사진은 제대로 가져오고, 동영상만 못가져옵니다 
cursor 널체크해보면 cursor은 널이 아닌데 movenext가 안되고있습니다

수원통학러 (3,570 포인트) 님이 2023년 9월 8일 질문
글자수제한으로 안올라가서 ... 부분입니다
 if (videoCursor != null) {
            while (videoCursor.moveToNext()) {
                try {
                    val idColumnIndex = videoCursor.getColumnIndex(MediaStore.Video.Media._ID)
                    val mimeTypeColumnIndex = videoCursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE)
                    val dateTakenColumnIndex = videoCursor.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN)
                    val sizeIndex = videoCursor.getColumnIndex(MediaStore.Video.Media.SIZE)

                    if (idColumnIndex == -1 || mimeTypeColumnIndex == -1 || dateTakenColumnIndex == -1 || sizeIndex == -1) continue

                    val id = videoCursor.getLong(idColumnIndex)
                    val mimeType = videoCursor.getString(mimeTypeColumnIndex)
                    val dateTakenMilliseconds = videoCursor.getLong(dateTakenColumnIndex)
                    val size = videoCursor.getLong(sizeIndex)
                    val uriPhote = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)
                    val imageInfo = PickerImageInfo()
                    imageInfo.mimeType = mimeType
                    imageInfo.imageUri = uriPhote
                    imageInfo.date = LocalDateTime.ofInstant(Instant.ofEpochMilli(dateTakenMilliseconds), ZoneId.systemDefault())
                    imageInfo.size = size
                    MLog.d(TAG, "image uri : $uriPhote")

                    if (allowExtensions.isEmpty()) {
                        if (mimeType.contains("mp4")) {
                            photos.add(imageInfo)
                        }
                    } else {
                        for (ext in allowExtensions) {
                            if(mimeType.contains(ext)) {
                                photos.add(imageInfo)
                                break
                            }
                        }
                    }
                } catch (e: Exception) {
                    MLog.e(TAG, e.toString())
                }
            }
        }

        videoCursor?.close()

        return photos

1개의 답변

0 추천

혹시 권한체크는 하셨나요? 안드로이드 13 부터는 미디어 타입에 따라

Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_VIDEO

권한을 사용자로부터 얻어야 합니다. 해당 권한이 있는지 체크하시고 없으면 권한을 사용자에게 요청하는 로직을 집어넣으세요.

spark (227,530 포인트) 님이 2023년 9월 16일 답변
권한도 이미 다있고, 해당화면가기전에 이미 권한을 다받아놓습니다
근데도 안나오네요
https://developer.android.com/training/data-storage/shared/media#query-collection
위에 링크에 가시면 개발자 문서에 샘플코드가 있습니다. 이 코드를 한번 테스트해 보시면, 쿼리의 문제인지 아닌지 구분이 가능하겠죠. 문제의 원인이 될만한 것을 하나씩 줄여나가 보세요.
다른거라고는 저는 VideoColumns을 문서에선, Media로 쓰고있는데
이걸다 Media로 바꿔줘도 똑같네요 나머지는 영상길이 필터링있고 없고 밖에 없어요..
...