2

为了减少在整个应用程序中的许多地方使用 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()被调用并且运行良好。

4

1 回答 1

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

在此处输入图像描述

于 2012-07-20T00:39:06.230 回答