繁体   English   中英

媒体播放器抛出非法 state 异常

[英]Media player throwing illegal state exception

我正在尝试播放歌曲,但媒体播放器抛出 IllegalState 异常。这就是我尝试播放歌曲的方式

private fun playSong(songPath: String) {
        if (mediaPlayer != null) {
            if (mediaPlayer!!.isPlaying) {
                stopPlay()
                mediaPlayer!!.setDataSource(songPath)
                mediaPlayer!!.setOnPreparedListener(this)
                mediaPlayer!!.setOnCompletionListener(this)
                mediaPlayer!!.prepareAsync()
            } else {
                mediaPlayer!!.setDataSource(songPath)
                mediaPlayer!!.setOnPreparedListener(this)
                mediaPlayer!!.setOnCompletionListener(this)
                mediaPlayer!!.prepareAsync()
            }
        } else {
            mediaPlayer = MediaPlayer()
            mediaPlayer!!.setDataSource(songPath)
            mediaPlayer!!.setOnPreparedListener(this)
            mediaPlayer!!.setOnCompletionListener(this)
            mediaPlayer!!.prepareAsync()
        }

这就是我停止游戏的方式

private fun stopPlay() {
        mediaPlayer!!.pause()
        mediaPlayer!!.stop()
    }

媒体播放器抛出的异常是

java.lang.IllegalStateException
        at android.media.MediaPlayer._setDataSource(Native Method)

当您重新使用相同的媒体播放器实例时,您应该在 setDataSource 之前调用 reset() 。

    if (mediaPlayer != null) {
        if (mediaPlayer?.isPlaying == true) {
            stopPlay()
        } 
        mediaPlayer?.reset()
    } else {
        mediaPlayer = MediaPlayer()
    }
    mediaPlayer?.setDataSource(songPath)
    mediaPlayer?.setOnPreparedListener(this)
    mediaPlayer?.setOnCompletionListener(this)
    mediaPlayer?.prepareAsync()

您需要在setDataSource之前reset媒体播放器,并设置setOnErrorListener并像重置媒体播放器一样处理错误。

private fun playSong(songPath: String) {
    if (mediaPlayer != null) {
        if (mediaPlayer?.isPlaying == true) {
            stopPlay()
        }
        mediaPlayer?.reset()
    } else {
        mediaPlayer = MediaPlayer()
    }
    mediaPlayer?.setDataSource(songPath)
    mediaPlayer?.setOnPreparedListener(this)
    mediaPlayer?.setOnCompletionListener(this)
    mediaPlayer?.setOnErrorListener(this)
    mediaPlayer?.prepareAsync()
}

override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean {
    mp.reset()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM