Android 28 Kotlin播放HTTP流媒体在暂停中失败并再次播放



我想问一些有关HTTP流媒体播放器的问题。当涉及执行时,它表现良好。当我按暂停并再次播放时,会发生以下错误:

目的地URL是http://www.radioideal.net:8026/;stream/1

错误消息:

prepareAsync called in state 1, mPlayer(0x0)

您能告诉我什么是管理HTTP MP3音频流的正确序列?以下是我的工作。

代码:

class AudioActivity : AppCompatActivity() , EBookRetrieveRecordListener {
    private var requestType = "audio"
    private var mediaPlayer: MediaPlayer? = null
    private var progressDialog: ProgressDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_audio)
        initSetting()
        initView()
    }
    private fun initView() {
        btn_audio_play.setOnClickListener({
            if (mediaPlayer!!.isPlaying) pause() else play()
        })
    }
    override fun onDestroy() {
        super.onDestroy()
        stop()
    }
    private fun play() {
        config()
        btn_audio_play!!.setImageResource(android.R.drawable.ic_media_pause)
    }
    private fun pause() {
         mediaPlayer!!.pause()
    mediaPlayer!!.reset();
        btn_audio_play!!.setImageResource(android.R.drawable.ic_media_play)
    }
    private fun stop(){
        mediaPlayer!!.stop()
        mediaPlayer!!.release()
        mediaPlayer = null
    }

    private fun config() {
        try {
            progressDialog = ProgressDialog(this)
            progressDialog!!.setMessage(MESSAGE)
            progressDialog!!.setCancelable(false)
            progressDialog!!.show()
            val audioBuilder = AudioAttributes.Builder()
            audioBuilder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            audioBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC)
            val attribute : AudioAttributes = audioBuilder.build()
            mediaPlayer!!.setAudioAttributes(attribute )
            mediaPlayer!!.isLooping = true
            mediaPlayer!!.setOnPreparedListener {
                it.start()
                progressDialog!!.dismiss()
            }
            mediaPlayer!!.setOnErrorListener { mp, what, extra ->
                Log.i(TAG, "mp: ${mp}nwhat: ${what}nextra: $extra")
                progressDialog!!.dismiss()
                false
            }
            mediaPlayer!!.setOnCompletionListener {
                mediaPlayer!!.release()
            }

            mediaPlayer!!.setOnBufferingUpdateListener { mp, percent ->
                mp.start()
            }
            mediaPlayer!!.prepareAsync()
        } catch (e : Exception){
            e.message
        }
    }
    private fun initSetting() {
        EBookRetrieveRecordManager.listener = this
        //config()
        val url = "http://www.radioideal.net:8026/;stream/1"
        mediaPlayer = MediaPlayer()
        mediaPlayer!!.setDataSource(url);
    }
}

从您的代码中,initSettingconfig方法只能称为>一次。并且不要将mediaPlayer!!.reset()也放入play方法中。

将其放在一起:

private var mediaPlayer: MediaPlayer? = null
private var progressDialog: ProgressDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_audio)
    initView()
}
private fun initView() {
    btn_audio_play.setOnClickListener {
        mediaPlayer?.let {
            if (it.isPlaying) pause() else resume()
        } ?: run {
            initSetting()
            play()
        }
    }
}
private fun initSetting() {
    val url = "http://www.radioideal.net:8026/;stream/1"
    mediaPlayer = MediaPlayer()
    mediaPlayer!!.setDataSource(url)
    config()
}
private fun config() {
    try {
        progressDialog = ProgressDialog(this)
        progressDialog!!.setMessage(MESSAGE)
        progressDialog!!.setCancelable(false)
        progressDialog!!.show()
        val audioBuilder = AudioAttributes.Builder()
        audioBuilder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        audioBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC)
        val attribute: AudioAttributes = audioBuilder.build()
        mediaPlayer!!.setAudioAttributes(attribute)
        mediaPlayer!!.isLooping = true
        mediaPlayer!!.setOnPreparedListener {
            it.start()
            progressDialog!!.dismiss()
        }
        mediaPlayer!!.setOnErrorListener { mp, what, extra ->
            Log.i(TAG, "mp: ${mp}nwhat: ${what}nextra: $extra")
            progressDialog!!.dismiss()
            false
        }
        mediaPlayer!!.setOnCompletionListener {
            mediaPlayer!!.release()
        }
        mediaPlayer!!.setOnBufferingUpdateListener { mp, percent ->
            mp.start()
        }
    } catch (e: Exception) {
        e.message
    }
}
private fun play() {
    mediaPlayer!!.prepareAsync()
    btn_audio_play!!.setImageResource(android.R.drawable.ic_media_pause)
}
private fun pause() {
    mediaPlayer!!.pause()
    btn_audio_play!!.setImageResource(android.R.drawable.ic_media_play)
}
private fun resume() {
    mediaPlayer!!.start()
    btn_audio_play!!.setImageResource(android.R.drawable.ic_media_pause)
}
override fun onDestroy() {
    super.onDestroy()
    stop()
}
private fun stop() {
    mediaPlayer!!.stop()
    mediaPlayer!!.release()
    mediaPlayer = null
}

最新更新