22

我在使用 Android 的 MediaPlayer 时遇到问题。它似乎缺少重要的功能,主要是获取 MediaPlayer 的当前状态或了解它是否准备好的方法。我知道有准备好的监听器,但是 MediaPlayer 的持续时间比 Activity 长,所以当播放 Activity 恢复时,获取当前播放器状态会很好,无论它是否尝试加载媒体,是否加载媒体等. 我错过了什么,还是我必须自己跟踪玩家状态?

其他不错的功能是 onPlayStateChanged() - 我目前必须手动跟踪播放状态。我做错了吗?

4

6 回答 6

18

希望现在给出答案还为时不晚。MediaPlayer类没有isPrepared () 或 getStatus() 方法,您必须自己跟踪其状态。然而,这并不难。

MediaPlayer 类有一个非常有用的状态图。您应该根据该图实现您的服务。此外,如果您始终从同一个线程控制 MediaPlayer 对象,则很容易跟踪其状态,因此我建议您这样做。prepareAsync() 方法是您必须处理的唯一异步方法,但您可以保留一个布尔值,指示播放器正在准备中,从 prepareAsync() 调用直到 onPrepared() 为“真”叫。无论如何,如果您不小心从非法状态调用任何方法,您始终可以实现 onError 并捕获 IllegalStateException 以避免崩溃。

尽管如此,媒体播放指南对我帮助很大。

于 2013-10-11T08:41:56.097 回答
11

我需要在调试时查看状态以解决问题,所以在我知道 MediaPlayer 已经准备好之后,我只是将这段代码放在了某个地方:

try {
    this.audioPlayer.prepare();
} catch (Exception e) {
}

这会向控制台打印一个错误,例如“E/MediaPlayer:在状态 32 中调用 prepareAsync”。

现在,如果我能找到一个列出所有状态代码的地方......

于 2014-08-17T06:45:39.797 回答
3

我发现了一些可能对你和其他人有帮助的东西。MediaPlayer 类中有一个setOnPreparedListener()函数可以让您在准备好 MediaPlayer 时运行一段代码。

此外,如果您想确保您的媒体已加载,您可以使用该getDuration()功能。此代码以毫秒为单位返回持续时间,如果没有可用的持续时间,则返回 -1。下面是代码:

yourMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        if(yourMediaPlayer.getDuration() != -1){
            //your code when when something is loading
        }
    }
}
于 2020-03-14T17:53:14.270 回答
2

没有getStateMediaPlayer,但在内部它有一个状态,正如 alex.magellan 所解释的那样。在“不允许的状态”处调用方法会导致异常。

为了避免这些,我创建了一个StateMachinewithMediaPlayerWrapper类。因此,不是MediaPlayer直接调用,MediaPlayerWrapper而是使用它,它在内部更新StateMachine和公开getState()方法。

StateMachineWrapper类实现可以在这里找到。

于 2019-07-24T11:56:52.590 回答
0

我认为没有办法通过 MediaPlayer 类本身来做到这一点。

最简单的做法是在创建和重置时将全局变量设置为 true。它在发布时设置为 false。

boolean playerAvailable = true;

mediaPlayer = MediaPlayer.create(myContext, soundId); // ready to play

playerAvailable = true;

....

mediaPlayer.reset();   // ready to play again

playerAvailable = true;

....

mediaPlayer.release(); // can't be played until release.

playerAvailable = false;
于 2019-11-07T13:03:14.503 回答
0

您可以通过使用预定义的布尔变量并在调用 onPrepared() 回调时将其设置为 true 并在 MediaPlayer 启动时将其设置为 false 来解决此问题。例如:

public boolean mpPrepared = false;

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mpPrepared = true;
    }
});

mp.start();
mpPrepared = false;
于 2021-02-23T12:01:36.470 回答