为了减少在应用程序中的许多地方使用 MediaPlayer 时的行数,我对 MediaPlayer 进行了子类化,并在构造函数中调用每次需要播放媒体文件时重复的 3 行代码:
public MyMediaPlayer(Context context, int resid) {
create(context, resid);
setOnCompletionListener(this);
start();
}
因此,我只将其放在调用者中,而不是那 3 行:
new MyMediaPlayer(this, R.raw.happybirthday);
它可以编译、构建甚至运行,但由于某种原因媒体文件无法播放。
我检查了 LogCat 并注意到:
07-19 20:00:51.124: E/MediaPlayer(16517): start called in state 1
07-19 20:00:51.124: E/MediaPlayer(16517): error (-38, 0)
这些错误意味着什么?
我错过了什么?
顺便说一句,onCompletion()被调用并且运行良好。
最佳答案
这意味着:MediaPlayer 遵守状态图,并且您不能在每个状态下调用 start()。下面是状态图,您没有在Prepared、PlaybackCompleted 或Paused 中调用start。
即使您在正确的状态下执行此操作,直接在 onCreate 或任何其他初始化方法中调用它也不是一个好习惯,因为这些方法是为初始化布局和应用程序而保留的。
您可以在 onCreate() 或 onStart() 之一中执行以下操作,以确保完成后播放。
// delaying play until after all application initialization is done
findViewById(R.id.main_page_layout).post(new Runnable() {
public void run() {
//play your music here
}
});
关于android - MediaPlayer.start() 不能在构造函数中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571118/