MediaPlayerで音楽を再生する


Androidでの音楽再生はとても簡単です。

今回は、MediaPlayerコンポーネントを使って音楽を再生する方法をリソースに合わせて2つ紹介します。

  • リソースファイルから再生する方法
  • ローカルファイルから再生する方法

MediaPlayerコンポーネントはandroid.mediaパッケージをimportすることで利用できます。音楽、動画(Audio/Video)の再生に対応しており、再生するファイルは、リソースファイル、ローカルファイル、インターネット上からのストリーミングなど保存場所を問いません。(ビデオはちょっと手間なのですが、それはまた次の機会に紹介します)

public class AudioPlayerActivity extends Activity {

	private MediaPlayer mp;
	private String path;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //リソースファイルから再生
        mp = MediaPlayer.create(this, R.raw.music);
        mp.start();

}

解説とローカルファイルからの再生については続きで。

再生対象のAudioはRes/raw以下へ配置

ソースコードで大事なのは13,14行目のみです。

        //リソースファイルから再生
        mp = MediaPlayer.create(this, R.raw.music);
        mp.start();

createメソッドの第1引数はContext、第2引数はresidです。
サンプルではthis(自分のコンテキスト)とR.raw.musicを指定します。

MediaPlayer.createメソッドのオーバーロード一覧

オーバーロード 説明
create(Context context, Uri uri) URI(URLなど)で指定
create(Context context, int resid) リソースファイルを指定
create(Context context, Uri uri, SurfaceHolder holder) 動画表示用。Serfaceを利用して表示するとき

リソースファイルにBGMや効果音、音声など音楽ファイルを入れる場合、
置く場所に注意して下さい。
resディレクトリのraw以下へ配置しないといけません。

ローカルファイルから再生

ローカルファイルから再生する場合も基本は同じですが、多少手順が異なります(なぜこのように処理を変えているかは不明)。

	private MediaPlayer mp;
	private String path;

        //ローカルファイルを再生
        mp = new MediaPlayer();
	mp.setDataSource(path);
	mp.prepare();
        mp.start();

MediaPlayerオブジェクトを作成、データソースを指定します。
prepareはMediaPlayerオブジェクトの事前準備を行うメソッドで、
datasource(および画面表示が完了)の設定後に呼び出します。

再生ファイルの指定の方法は4種類あります。

MediaPlayer.setDataSourceメソッドのオーバーロード一覧

オーバーロード一覧 説明
setDataSource(String path) ファイルパスもしくはhttp/rtsp URLが使えます
setDataSource(FileDescriptor fd, long offset, long length) FileDescriptorの詳細指定
setDataSource(FileDescriptor fd) FileDescriptorの簡易指定
setDataSource(Context context, Uri uri) URI(URL)でソースを指定


最も使いやすいのはString pathによるsetDataSourceです。
このあたりは、try/catchをしっかりする必要があるみたいで、上記のソースコードのままではコンパイルエラーとなる場合があります。
エラーが出た場合は、以下のように修正してください。

        try {
			mp.setDataSource(path);
		} catch (IllegalArgumentException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
        try {
			mp.prepare();
		} catch (IllegalStateException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
3 Comments