MediaPlayer で、ローカルのサウンド・ファイルを再生してみたよ。
やってることは、ほとんどリソース版とかわらないけどね。
public class mySound extends Activity { private MediaPlayer mp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String path = Environment.getExternalStorageDirectory().getPath()+"/" +"bgm0.mp3"; // トラック 0 mp = new MediaPlayer(); try{ mp.setDataSource( path ); mp.prepare(); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.setLooping(true); mp.start(); }catch( Exception e ){ Log.d("Err", "err mpPlay : " +path ); } //-- } @Override public void onDestroy(){ if(mp.isPlaying()){ mp.stop(); } super.onDestroy(); // アクティビティの終了 finish(); } }
MediaPlayer.create の代わりに、setDataSource をするみたいな感じ。
ただし、多少手間がかかる。
MediaPlayer オブジェクトを生成して、prepare() も実行してやらなきゃならない。
それと、setDataSource を、try ~ catch で囲ってやらなきゃならない。
囲わない場合、ビルド時にエラーが出るよ。
たぶん、指定したファイルをオープンできなかった場合を想定してるんだろうね。
なので、上記ソースでは再生までの手順を、try の中に含めている。
で、オープンできなかったり、なんらかのエラーが起こった場合は、logにパスを書き出すようにしているよ。
ちなみに上記ソースでは、SDカード上の”bgm0.mp3″を再生しているよ。
setDataSource のオーバーロード
setDataSource には以下のような種類があるよ。
setDataSource( String path ) setDataSource( FileDescriptor fd, long offset, long length ) setDataSource( FileDescriptor fd ) setDataSource( Context context, Uri uri )
今回は一番上のタイプを使ってみた。
path には、http や rtsp 等のURL指定が可能らしい。
で、試しに”http://…” へ変えてみたけど、ネット上のファイルを再生できなかった。
たぶん、ローカルのファイルに対して”http://”が使える、ということなんだろうね。
おそらくネット上のモノを再生するには、一番下のContext を指定するsetDataSource を使うんじゃないかな?
そのうち、試してみよう。
FileDescriptor は、ファイルを抽象化したclass…ってトコかね。
ファイル操作や、ユーザーにファイル選択させたりする時に使うclass だね。
それらの状況の時に使い勝手がよさそうだ。