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 に答える