Android mediaPlayer - 是否有“isPrepared()”或“getStatus()”方法?

时间:2012-08-09 03:08:55

标签: android android-mediaplayer

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

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

6 个答案:

答案 0 :(得分:13)

希望答案还为时不晚。 MediaPlayer类没有isPrepared()或getStatus()方法,你必须自己跟踪它的状态。然而,这并不困难。

MediaPlayer类有一个很好的状态图,确实有帮助。您应该根据该图实现您的服务。此外,如果您始终从同一个线程控制MediaPlayer对象,则很容易跟踪其状态,因此我建议您这样做。 prepareAsync()方法是你必须要处理的唯一异步方法,但是你可以保留一个布尔值来指示玩家正在准备,从prepareAsync()调用开始就是'true',直到onPrepared()为止。调用。无论如何,你总是可以实现onError并捕获IllegalStateException以避免在你不小心从非法状态调用任何方法时崩溃。

尽管如此,media playback guide给了我很多帮助。

答案 1 :(得分:7)

我需要在调试时查看状态以解决问题,所以在我知道MediaPlayer准备好后,我就把这段代码放到了某处:

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

向控制台输出错误,例如“E / MediaPlayer:在状态32中调用的prepareAsync。”

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

答案 2 :(得分:2)

我发现了一些可能对您和其他人有帮助的东西。 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
        }
    }
}

答案 3 :(得分:0)

没有getState类的MediaPlayer,但在内部它具有状态,如alex.magellan所述。在“不允许的状态”下调用方法会导致Exception。

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

StateMachineWrapper类的实现可以是found here.

答案 4 :(得分: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;

答案 5 :(得分: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;