使用mediaPlayer.release()时mediaPlayer崩溃

问题描述 投票:0回答:1

我们有RecyclerView与儿歌的列表,当你点击一首歌它带你到另一个活动mediaPlayer ..问题是,当我播放一首歌,然后使用返回底部歌曲停止,这是好的,应用程序停止这个是问题,但是当我评论//mediaPlayer.release()时,应用程序运行良好它没有崩溃,歌曲只在我回去时停止,但问题是当我从RecyclerView中选择另一首歌并单击PlayBotton时歌曲从一开始就开始,但SeekBar寻求结束并且不动。有没有人知道如何解决这个问题?

我试过但在Try和Catch之间的mediaPlayer.release()但问题仍然相同。

class ChildrenSongsPreview : AppCompatActivity() {

private var handler = Handler()
var mediaPlayer: MediaPlayer? = null
private var startTime = 0.0
private var finalTime = 0.0

private var updateSongTime = object : Runnable {
    override fun run() {
        startTime = mediaPlayer?.currentPosition!!.toDouble()
        txt_playing_duration.text = String.format(
            "%d:%d", TimeUnit.MILLISECONDS.toMinutes(startTime.toLong()),
            TimeUnit.MILLISECONDS.toSeconds(startTime.toLong()) -
                    TimeUnit.MINUTES.toSeconds(
                        TimeUnit.MILLISECONDS.toMinutes(startTime.toLong())
                    )
        )

        songs_seekbar.progress = startTime.toInt()
        handler.postDelayed(this, 100)
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_children_songs_preview)

    var pos = intent.getIntExtra("KEY_SONG", 0)
    var song_ID: Int = R.raw.zahab_elel

    when (pos) {
        0 -> {
            song_ID = R.raw.mama_zmanha_gaya
            txt_song_name_preview.text = "ماما زمانها جاية"
        }
        1 -> {
            song_ID = R.raw.zahab_elel
            txt_song_name_preview.text = "ذهب الليل"
        }
        2 -> {
            song_ID = R.raw.gdo_ali
            txt_song_name_preview.text = "جدو علي"
        }
        3 -> {
            song_ID = R.raw.ebre2_shay
            txt_song_name_preview.text = "إبريق الشاي"
        }
    }

    var position = 0
    mediaPlayer = MediaPlayer.create(this, song_ID)

    //set song duration
    finalTime = mediaPlayer?.duration!!.toDouble()
    txt_song_duration.text = String.format(
        "%d:%d",
        TimeUnit.MILLISECONDS.toMinutes(finalTime.toLong()),
        TimeUnit.MILLISECONDS.toSeconds(finalTime.toLong()) -
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(finalTime.toLong()))
    )

    btn_play.setOnClickListener {
        mediaPlayer?.seekTo(position)
        mediaPlayer?.start()
        btn_play.visibility = View.GONE
        btn_pause.visibility = View.VISIBLE

        if (oneTimeOnly == 0) {
            songs_seekbar!!.max = finalTime.toInt()
            oneTimeOnly = 1
        }

        songs_seekbar!!.progress = startTime.toInt()
        handler.postDelayed(updateSongTime, 100)
    }

    btn_pause.setOnClickListener {
        position = mediaPlayer?.currentPosition!!
        mediaPlayer?.pause()
        btn_pause.visibility = View.GONE
        btn_play.visibility = View.VISIBLE
    }

    btn_stop.setOnClickListener {
        mediaPlayer?.stop()
        position = 0
        btn_pause.visibility = View.GONE
        btn_play.visibility = View.VISIBLE
        mediaPlayer = MediaPlayer.create(this, song_ID)
    }

    mediaPlayer?.setOnCompletionListener {
        position = 0
        btn_pause.visibility = View.GONE
        btn_play.visibility = View.VISIBLE
        mediaPlayer = MediaPlayer.create(this, song_ID)
    }

    songs_seekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
        override fun onProgressChanged(seekBar: SeekBar?, p: Int, fromUser: Boolean) {
            if (fromUser) {
                position = p
            }
        }

        override fun onStartTrackingTouch(seekBar: SeekBar?) {
        }

        override fun onStopTrackingTouch(seekBar: SeekBar?) {
            mediaPlayer?.seekTo(position)
        }
    })
}

override fun onDestroy() {
    super.onDestroy()
    mediaPlayer?.stop()
    mediaPlayer?.release()
}

companion object {
    var oneTimeOnly = 0
  }
}
kotlin media-player
1个回答
0
投票

媒体播放器实例也应该在onDestroy()发布

override fun onDestroy() {
        mediaPlayer?.release()
        mediaPlayer = null
        super.onDestroy()
    }
© www.soinside.com 2019 - 2024. All rights reserved.