【问题标题】:How can I ask Android MediaPlayer not to play after onPrepared?如何让 Android MediaPlayer 在 onPrepared 后不播放?
【发布时间】:2018-03-02 18:51:46
【问题描述】:

我正在开发一个 Android 应用程序,该应用程序在后台执行大量并发和 RxJava,并且由于某种原因可能不想播放处于异步准备阶段的音乐:

player.prepareAsync()

override fun onPrepared(mp: MediaPlayer?) {
    isPreparing = false

    if (playAfterPreparing) {
        //start playback
        mp?.start()
    } else {
        // don't play and keep it prepare for later!!!
    }

    updateNotification()
}

但问题是在准备之后你应该玩(!)因为: Media Player called in state 0, error (-38,0)

我什至试图开始和暂停一个又一个准备:

override fun onPrepared(mp: MediaPlayer?) {
    Timber.i("onPrepared")
    Timber.i("playAfterPreparing: $playAfterPreparing")

    isPreparing = false

    //start playback
    mp?.start()

    if (!playAfterPreparing) {
        mp?.pause()
    }

    updateNotification()
}

但它不起作用,因为它呈现相同的问题。

我也知道 MediaPlayer 状态机是如何工作的,但在文档中看不到这种情况下的任何内容: https://developer.android.com/reference/android/media/MediaPlayer.html

这种情况有什么解决办法吗?

【问题讨论】:

  • after preparation you should play(!) 没有。如果您在准备时不开始播放,则不会出现错误。可能是其他原因造成的
  • @VladyslavMatviienko 这正是我想看到的行为!但正如我根据这个答案stackoverflow.com/questions/9008770/… 提到的那样,我总是得到-38 错误!
  • 我仍然认为您由于某些其他原因而收到该错误。没人知道你还在用你的媒体播放器做什么。
  • 好吧,如果你这么认为,我会写一个简单的应用,只有一个 MediaPlayer 来测试。
  • 本地VS在线应该无所谓

标签: android multithreading android-mediaplayer


【解决方案1】:

感谢@VladyslavMatviienko cmets,我怀疑我在其他地方做错了什么,他是对的。根据Android MediaPlayer document

可以保持Prepared 状态,但不能调用任何方法,即pause(),这是我的错。在Prepared状态下只能调用start()seekTo()stop()

希望这个答案对以后可能会遇到这个问题的人有用。

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多