Почему я не могу получить аудиоколонки?

#java #android #kotlin

Вопрос:

Я сохраняю аудио в хранилище 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?