New to Android and Kotlin...
I am trying to set a new audio data source for the Android MediaPlayer. The below code compiles and runs, but the sound isn't played. No crash, no errors. The toast "Media Player prepared!" never shows up, so I think the media player does not get prepared.
If I comment out the lines following "val mediaPlayer = MediaPlayer.create(this, R.raw.fifo50)", then it plays the fifo50 sound when I click the btnMaintain button.
What is missing here?
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()
}
}
CodePudding user response:
MediaPlayer.create(...)
return new instance of MediaPlayer
after call prepare()
. Is useless to call stop()
and reset()
after create(...)
. Using raw resource you have to setDataSource with AssetFileDescriptor
like setDataSource(resources.openRawResourceFd(R.raw.your_media))