我遇到了Android的MediaPlayer问题。它似乎缺少重要的功能,主要是获取MediaPlayer的当前状态或查明它是否已准备好的方法。我知道有准备好的监听器,但MediaPlayer持续的时间比活动长,因此当恢复播放活动时,获得当前播放器状态,无论是否正在尝试加载媒体,是否加载媒体等等都会很好。我错过了什么,或者我是否必须自己跟踪玩家状态?
其他很好的功能就是onPlayStateChanged() - 我目前必须手动保持跟踪播放状态。我做错了吗?
答案 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()
方法。
StateMachine
和Wrapper
类的实现可以是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;