今回は、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();
}