Android 28 Kotlin play Не удалось выполнить потоковую передачу по протоколу http. Приостановка и воспроизведение снова - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы задать вопрос о потоковой передаче http на мой аудиоплеер Android.Когда дело доходит до исполнения, это играет хорошо.Когда я нажимаю паузу и снова играю, возникает следующая ошибка:

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);

    }
}

1 Ответ

0 голосов
/ 22 февраля 2019

Из вашего кода методы initSetting и config следует вызывать только один раз .И не ставьте 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
}
...