java - 如何正确检索所有本地音频文件及其参数的列表?
问题描述
目前,我正在使用内容解析器来执行此操作。代码:
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()
}
所以,有几个问题:
- 主要的。我是否应该使用 MediaStore.MediaColumns.DATA 来获取 URI?我知道谷歌告诉“有时你没有使用存储的权限,等等,这就是它被弃用的原因”,但有没有更好的方法(我总是需要权限)?
- 关于“MediaStore.MediaColumns.ARTIST”和“MediaStore.MediaColumns.ALBUM”。为什么它需要 API 30,如果我在 5-6 年前的教程中发现它的用法,尽管根本没有 API 30?因为支持库、迁移等?我应该继续使用它吗?
解决方案
推荐阅读
- react-native - React Native 构建签名的 apk 任务:app:signingConfigWriterRelease FAILED
- monitoring - 有什么方法可以监控 Airflow DAG 的执行时间?
- javascript - CropperJS 在模态中使用时效果不佳
- html - 如何制作 svg 图标(使用
- python - 3D 平面拟合方法(C++ 与 Python)
- android - 升级到flutter v1.12.13后,flutter build linking failed ttcIndex not found
- java - Spring 应用程序抛出 ArrayIndexOutOfBoundsException
- google-apps-script - 谷歌脚本“e.changeType=='INSERT_ROW'”功能 - 插入新行时读取
- swift - 存储中的 Firebase 映像被重写,仅保留最后两个
- html - 当包含在相对跨度中时,绝对位置在 Chrome 中无法正常工作