java - 为什么我无法获取 audioColumns?
问题描述
我正在将音频保存到 Mediastore,它可以工作。但是,当我尝试获取此音频的列时,它给了我空值。这是我的下载代码:
fun download(audio: Audio) {
val audioOutStream: OutputStream
val imageOutStream: OutputStream
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val values = ContentValues()
val imageValues = ContentValues()
imageValues.put(MediaStore.Audio.Media._ID, "${audio.writer?._id}")
values.put(MediaStore.Audio.AudioColumns._ID, "${audio._id}")
values.put(MediaStore.Audio.AudioColumns.DISPLAY_NAME, "${audio.title}.mp3")
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
values.put(MediaStore.Audio.AudioColumns.DATE_ADDED, audio.createdAt)
values.put(MediaStore.Audio.AudioColumns.TITLE, audio.writer?.name)
values.put(MediaStore.Audio.AudioColumns.WRITER, audio.writer?.name)
values.put(MediaStore.Audio.AudioColumns.ARTIST_ID, audio.writer?._id)
values.put(
MediaStore.Audio.Media.RELATIVE_PATH,
"${Environment.DIRECTORY_MUSIC}/Soundy/"
)
imageValues.put(
MediaStore.Images.Media.RELATIVE_PATH,
"${Environment.DIRECTORY_DCIM}/Soundy/"
)
val uri = context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)
val imageUri = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageValues)
audioOutStream = context.contentResolver.openOutputStream(uri!!)!!
imageOutStream = context.contentResolver.openOutputStream(imageUri!!)!!
} else {
val audioPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString() + "/Soundy/"
val imagePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + "/Soundy/"
val audioFile = File(audioPath, audio.title!!)
val imageFile = File(imagePath, audio.writer?._id!!)
audioOutStream = FileOutputStream(audioFile)
imageOutStream = FileOutputStream(imageFile)
}
val requestImage = Request.Builder().url(audio.writer?.image).build()
val request = Request.Builder().url(audio.filePath).build()
val responseImage = OkHttpClient().newCall(requestImage).execute()
val response = OkHttpClient().newCall(request).execute()
val sinkImage: BufferedSink = imageOutStream.sink().buffer()
val sink: BufferedSink = audioOutStream.sink().buffer()
sinkImage.writeAll(responseImage.body()!!.source())
sink.writeAll(response.body()!!.source())
sinkImage.close()
sink.close()
audioOutStream.close()
imageOutStream.close()
}
这是我获取音频的代码:
private var offlineAudioList: List<Audio>
private fun getAudio() {
val cursor = requireContext().contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER
)
for (i in 0 until cursor?.count!!) {
cursor.moveToNext()
val isMusic = cursor.getInt(
cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)
)
if (isMusic != 0) {
val audio = Audio(
_id = cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns._ID)
), filePath = "/storage/" + cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.RELATIVE_PATH)) + cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.TITLE)) + ".mp3",
title = cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DISPLAY_NAME)
), duration = cursor.getInt(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DURATION)
), writer = User(
image = cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.ARTIST_ID)
),
name = cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.WRITER)
)
)
)
offlineAudioList = offlineAudioList.plus(audio).distinctBy { it._id }
}
}
}
所以我得到了音频的标题,但就是这样。其他字段给我null。我该如何解决?另外,如何获得音频的完整路径以使用 exoplayer 播放它?
解决方案
推荐阅读
- php - 如何使用 PHP 在 twilio 来电显示手机号码列表中添加手机号码?
- python - 如何从文件夹中动态导入脚本并在 Python 中动态执行函数?
- android - 将前置摄像头更改为后置摄像头时的摄像头 X CameraSelector 问题
- nuxt.js - Nuxt.js 说编译时有一些错误
- java - android studio 中的传感器类型
- windows - Apache-ignite 集群需要很长时间才能启动
- python - (Python 递归)从 *args(包含字符串的列表列表)中获取所有可能的字符串组合:
- python - 如何在python 3中获取给定字符串中的出现次数
- python - Jupyter 将列详细信息打印为 html Ipython
- linux - 找不到此文件夹/sys/devices/system/cpu/cpu0/cpuidle