【问题标题】:Unable to retrieve latest downloaded Video using MediaStore无法使用 MediaStore 检索最新下载的视频
【发布时间】:2021-01-15 14:40:44
【问题描述】:

我正在使用DownloadManager 下载下载目录中的视频。下载视频后,我使用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))
                        }
                    }
                }
            }

媒体商店代码

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 获取我的应用最后下载的视频信息所采用的方法。另外,我不确定这是否是最好的方法。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: android mediastore android-11


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2012-10-10
      相关资源
      最近更新 更多