遅いけど MediaPlayer を使いましょう
Android で mp3 やらの再生時間が欲しいときにどうやったらスマートに再生時間(長さ)を取得できるのか?という疑問はときどき出てくるんだけど、車輪の再発明的なアプローチは大変だから、遅いけどMediaPlayer使いましょうという話。
ぜんてい
- オーディオファイルの再生時間を知りたい
- MediaStore が効いていない場合(ダウンロード直後等)
サンプル
public static int getDuration(File audioFile) {
MediaPlayer mp = new MediaPlayer();
FileInputStream fs;
FileDescriptor fd;
fs = new FileIputStream(audioFile);
fd = fs.getFD();
mp.setDataSource(fd);
mp.prepare();
int length = mp.getDuration()
mp.release();
return length;
}
このコードは MediaPlayer#prepare() しているので遅い。でもこれが確実でいいよ♪
FileDescriptor について
FileDescriptor って、Javaのずっと昔からあるクラスなんだけど、知られていないクラス。良くある初心者向けの解説書なんかには絶対出てこないレベル。で、MediaPlayer#setDataSource が引数に File を取らないのは何故だろう?FileDescriptor なのは何故?という話。
MediaPlayer#setDataSource(String path) というのもあって、path はファイルのパスもOKだし、http, rtsp といったプロトコルのURLでもOK。Android なんかはネットに接続されたデバイスで、ローカルのファイルもネット上の何かも同じように扱うという思想が反映された実装。FileDescriptor 自体は実行環境のInputもOutputも扱うより抽象的な概念で、それがローカルファイルであろうと、インターネット上のものであろうと抽象的に取り扱う。だから、 MediaPlayer#setDataSource(File file) はあるだけできもい。
さんこう
- android - Determining the duration and format of an audio file - Stack Overflow - http://goo.gl/sDjn7X
- FileDescriptor について丁寧に解説したURLが・・・消えた
あとがき
- グロースハッカーはいなくなっていいよ