2011年5月4日水曜日

MediaPlayerを利用した楽曲の再生 - Playback of music using MediaPlayer class -

このエントリーをはてなブックマークに追加
MediaPlayerクラスはオーディオファイルの再生制御に利用できます。そのクラスを利用して、楽曲の再生、一時停止、停止の機能を実装してみました。

MediaPlayer class can be used to control playback of audio files. We tried coding the function of playback, pause, and stop of music using the class.



機能
Start 曲の再生
Pause 曲の一時停止
Stop 曲の停止


オーディオファイルの格納
/res/raw配下に置きます。今回はmusic.mp3というオーディオファイルをそこに置きました。マイクロカードに置いて再生することもできるようですが、その際はコード中にファイルパスを指定するメソッドを呼び出す必要があります。


MediaPlayerクラスに含まれるメソッド
create MediaPlayerオブジェクトを生成
isPlaying 再生状態の確認
prepare 再生準備
start 再生開始
pause 一時停止
stop 停止


再生制御
まず、createでMediaPlayerオブジェクトを生成します。その後、startで曲の再生状態となります。再生状態中にpause、stopを呼び出すとそれぞれ一時停止状態、停止状態になります。一時停止状態からstartを呼び出すと再生状態となりますが、停止状態からstartを呼び出しても再生状態にはなりません。停止状態から再生状態へするためにはprepareを挟む必要があります(stop→prepare→start)。


ソースコード
/SGL/src/sgl/example/media/MusicPlayer.java
package sgl.example.media;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MusicPlayer extends Activity implements OnClickListener{
     View startButton;
     View pauseButton;
     View stopButton;
     MediaPlayer mediaPlayer;
     boolean stop = false;

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mediaPlayer = MediaPlayer.create(this, R.raw.music);

        setContentView(R.layout.main);
        startButton = this.findViewById(R.id.start_button);
        startButton.setOnClickListener(this);
        pauseButton = this.findViewById(R.id.pause_button);
        pauseButton.setOnClickListener(this);
        stopButton = this.findViewById(R.id.stop_button);
        stopButton.setOnClickListener(this);
    }

     @Override
     public void onDestroy() {
          super.onDestroy();
          mediaPlayer.release();
     }

     public void onClick(View v) {
          switch (v.getId()) {
          case R.id.start_button:
               if (mediaPlayer.isPlaying()){
                    break;
               }

               if (stop) {
                    try {
                         mediaPlayer.prepare();
                    } catch (IllegalStateException e) {
                         e.printStackTrace();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                    stop = false;
               }

               mediaPlayer.start();
               break;
          case R.id.pause_button:
               mediaPlayer.pause();
               break;
          case R.id.stop_button:
               mediaPlayer.stop();
               stop = true;
               break;
          }
     }
}


実行結果
端末
再生→一時停止の繰り返しは正常に動作するのですが、再生→停止は正常動作しないことがよくありました。おそらく、リソースがうまく解放されていないか、状態遷移のタイミングがずれていることが原因ではないかと予想しているのですが、結局この原因はよく分かりませんでした。。

シミュレータ
再生→一時停止、または再生→停止の繰り返しは正常に動作しました。しかし、停止を押下したときの動作は一時停止であり、停止→再生で曲の最初から再生されることはありませんでした。この原因もよく分からなかったです。。


結局、制御がうまくできませんでした。。扱いが難しいです。

0 件のコメント:

コメントを投稿