尝试在我的应用程序中的许多地方使用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)
这些错误意味着什么?
我错过了什么?
BTW,onCompletion()被调用并运行正常。
答案 0 :(得分:4)
这意味着: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
}
});