无法使用 MediaStore 检索最新下载的视频

Unable to retrieve latest downloaded Video using MediaStore

我正在使用 DownloadManager 下载 Downloads 目录中的视频。下载视频后,我使用 MediaStore 查询下载目录。问题是我得到的是最后下载的视频,而不是最新的。

视频下载码

val request = DownloadManager.Request(Uri.parse(downloadUrl))
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
                .setDestinationInExternalPublicDir(
                    Environment.DIRECTORY_DOWNLOADS,
                    "MyApp/CategoryOne/123.mp4"
                )
                .setTitle(fileName)
                .setDescription(context.getString(R.string.all_text_downloading))

            val downloadManager =
                context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
            val downloadID = downloadManager.enqueue(request)

            var isDownloadFinished = false
            var downloadProgress: Int
            while (!isDownloadFinished) {
                val cursor: Cursor =
                    downloadManager.query(DownloadManager.Query().setFilterById(downloadID))
                if (cursor.moveToFirst()) {
                    when (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
                        DownloadManager.STATUS_FAILED -> {
                            isDownloadFinished = true
                            emit(State.error(context.getString(R.string.all_error_download_failed)))
                        }
                        DownloadManager.STATUS_PAUSED -> {
                        }
                        DownloadManager.STATUS_PENDING -> {
                        }
                        DownloadManager.STATUS_RUNNING -> {
                            val totalSizeInBytes: Long =
                                cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))
                            if (totalSizeInBytes >= 0) {
                                val downloadedBytes: Long =
                                    cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))
                                downloadProgress =
                                    (downloadedBytes * 100L / totalSizeInBytes).toInt()

                                emit(State.downloading(downloadProgress))
                            }
                        }
                        DownloadManager.STATUS_SUCCESSFUL -> {
                            downloadProgress = 100
                            emit(State.downloading(downloadProgress))
                            isDownloadFinished = true

                            val downloadedVideo = getDownloadedVideo()
                            emit(State.success(true))
                        }
                    }
                }
            }

MediaStore 代码

fun getDownloadedVideo(): MediaStoreVideo {
        lateinit var mediaStoreVideo: MediaStoreVideo

        val projection = arrayOf(
            MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DISPLAY_NAME,
            MediaStore.Video.Media.SIZE,
            MediaStore.Video.Media.DATE_ADDED
        )
        val selection =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) "${MediaStore.Video.Media.RELATIVE_PATH} like ? " else "${MediaStore.Video.Media.DATA} like ? "
        val selectionArgs =
            arrayOf("%MyApp/CategoryOne%")
        val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"

        context.contentResolver.query(
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            sortOrder
        )?.use { cursor ->
            val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
            val dateAddedColumn =
                cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_ADDED)
            val displayNameColumn =
                cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)
            val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)

            if (cursor.moveToFirst()) {
                val id = cursor.getLong(idColumn)
                val contentUri = ContentUris.withAppendedId(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                    id
                )
                val displayName = cursor.getString(displayNameColumn)
                val size = cursor.getLong(sizeColumn)
                val dateAdded =
                    Date(TimeUnit.SECONDS.toMillis(cursor.getLong(dateAddedColumn)))

                mediaStoreVideo = MediaStoreVideo(id, contentUri, displayName, size, dateAdded)

            }
        }
        return mediaStoreVideo
    }

这是我使用 DownloadManager 获取我的应用上次下载的视频信息的方法。另外,我不确定这是否是执行相同操作的最佳方法。任何帮助将不胜感激。谢谢

经过一些测试,我认为条目添加到 MediaStore 之前需要几毫秒。我添加了 1000 ms 的延迟,现在一切正常。

但是,这是一个临时解决方案,如果有人可以提出更好的方法,那将会更有帮助。