无法在构造函数中调用MediaPlayer.start()?

时间:2012-07-20 00:10:32

标签: android media-player android-mediaplayer

尝试在我的应用程序中的许多地方使用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()被调用并运行正常。

1 个答案:

答案 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
       }
    });

enter image description here