首页> 疑难解答

使用mediaPlayer.release()时mediaPlayer崩溃

withpy 2021-06-18

简介我们有RecyclerView与儿歌的列表,当你点击一首歌它带你到另一个活动mediaPlayer ..问题是当我播放一首歌然后使用后面的歌曲停止...

我们有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
  }
}
0
投票

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

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

上一篇:验证损失在3个时期后增加,但验证准确性不断提高

下一篇:这个。$ set只设置一次数据

相关文章

  • magento 2以编程方式基于规则生成优惠券代码

    我在Magento 2中创建了一条规则,例如10%折扣,此规则使用自动生成的优惠券代码,而不是预先指定的代码。我想知道如何根据规则生成代码...

  • 最简单的隐藏和显示svg的方法?

    我正在使用角度7.我有2个svgs:一个是黑色的,我希望在它被盘旋时显示另一个颜色。这是我的测试片段:来自'@ angular / core'的import {Component}; ...

  • 注册脚本不再将用户插入表中,也不允许登录

    注册成员并允许他们登录(更新表等)都工作正常,直到我最近做出这个改变。基本上说,如果这个人登录检查他们是否是会员或......

  • 保存天文台时间?

    我想将我的android studio计时器的时间保存在一个可在应用程序内访问的txt文件中。 (例如,单击“保存”按钮,计时器的值将保存在txt中...

  • 隐藏后阶段没有开始

    我想每5秒显示一次隐藏表格。当形式被隐藏 - 它不再显示。我不明白为什么会这样。父root = FXMLLoader.load(getClass()。getResource(“sample.fxml”)); primaryStage ....

  • 在一定时间之前强制玩家到GetKeyUp

    所以我正在研究这个2D跑步者并且我正在使用transform.position函数,但是我注意到这使得Unity中的引力不起作用。我仍然希望它工作,所以我设置了这个人工...