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