首页 > 解决方案 > 如何正确检索所有本地音频文件及其参数的列表?

问题描述

目前,我正在使用内容解析器来执行此操作。代码:

private fun loadMedia(): List<LocalMusic> {
    val list = mutableListOf<LocalMusic>()

    val contentResolver = context.contentResolver

    val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val selection = "${MediaStore.Audio.Media.IS_MUSIC}!= 0"
    val sortOrder = "${MediaStore.Audio.Media.TITLE} ASC"
    var i = 0
    contentResolver.query(uri, null, selection, null, sortOrder).use {
        if (it != null && it.count > 0) {
            while (it.moveToNext()) {
                val title = it.getString(it.getColumnIndex(MediaStore.MediaColumns.TITLE))
                // Android Studio shows a lint, which tells that MediaStore.MediaColumns.ARTIST 
                //requires API 30. But in Android Pie it works.
                val artist = it.getString(it.getColumnIndex(MediaStore.MediaColumns.ARTIST))
                //the same lint as described above(required api 29)
                val album = it.getString(it.getColumnIndex(MediaStore.MediaColumns.ALBUM))
                // This one is deprecated(fantastic, what to do?).
                val source = it.getString(it.getColumnIndex(MediaStore.MediaColumns.DATA))
                val duration = it.getLong(it.getColumnIndex(MediaStore.MediaColumns.DURATION))
                list.add(LocalMusic(id = "$i", artist = artist, title = title, source = source,
                        album = album, duration = duration, image = "some uri"))
                i++
            }
        }
    }
    return list.toList()
}

所以,有几个问题:

  1. 主要的。我是否应该使用 MediaStore.MediaColumns.DATA 来获取 URI?我知道谷歌告诉“有时你没有使用存储的权限,等等,这就是它被弃用的原因”,但有没有更好的方法(我总是需要权限)?
  2. 关于“MediaStore.MediaColumns.ARTIST”和“MediaStore.MediaColumns.ALBUM”。为什么它需要 API 30,如果我在 5-6 年前的教程中发现它的用法,尽管根本没有 API 30?因为支持库、迁移等?我应该继续使用它吗?

标签: javaandroidkotlinandroid-mediaplayer

解决方案


推荐阅读