如何在 Kotlin 中为 Android MediaPlayer 设置新的音频数据源

How to set a new audio data source for Android MediaPlayer in Kotlin

Android 和 Kotlin 的新手...

我正在尝试为 Android MediaPlayer 设置新的音频数据源。下面的代码编译并运行,但没有播放声音。没有崩溃,没有错误。敬酒“媒体播放器准备好了!”从来没有出现,所以我认为媒体播放器没有做好准备。

如果我注释掉“val mediaPlayer = MediaPlayer.create(this, R.raw.fifo50)”之后的行,那么当我点击 btnMaintain 按钮时它会播放 fifo50 声音。

这里缺少什么?

class MainActivity :
AppCompatActivity(),
MediaPlayer.OnPreparedListener{


override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val btnMaintain = findViewById<Button>(R.id.btnMaintain)
    val mediaPlayer = MediaPlayer.create(this, R.raw.fifo50)
    mediaPlayer.stop()
    mediaPlayer.reset()
    mediaPlayer.setAudioAttributes(
        AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build()
                )
    mediaPlayer.setDataSource("android.resource://" + this.packageName + "/raw/maintain_speed")
    Toast.makeText(this, "Preparing Media Player", Toast.LENGTH_SHORT).show()
    mediaPlayer.setOnPreparedListener(this)
    mediaPlayer.prepareAsync()
    Toast.makeText(this, "Asynchronous preparation of Media Player started", Toast.LENGTH_SHORT).show()

    btnMaintain.setOnClickListener() {
        mediaPlayer.isLooping = true
        mediaPlayer.start()
    }
}

override fun onPrepared(p0: MediaPlayer) {
    Toast.makeText(this, "Media Player prepared!", Toast.LENGTH_SHORT).show()
}

}

MediaPlayer.create(...) return 调用 prepare()MediaPlayer 的新实例。在 create(...) 之后调用 stop()reset() 是没有用的。使用原始资源,您必须使用 AssetFileDescriptor 设置数据源,例如 setDataSource(resources.openRawResourceFd(R.raw.your_media))