MediaPlayerで音楽を再生する


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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行目のみです。

12
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以下へ配置しないといけません。

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

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

1
2
3
4
5
6
7
8
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をしっかりする必要があるみたいで、上記のソースコードのままではコンパイルエラーとなる場合があります。
エラーが出た場合は、以下のように修正してください。

1
2
3
4
5
6
7
8
9
10
11
12
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();
}
1
2
3
4
5
6
7
8
9
try {
    mp.prepare();
} catch (IllegalStateException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
} catch (IOException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
}
3 Comments