FC2ブログ

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】MediaPlayer で再生しようとしたらファイル読み込みに失敗

MediaRecorder を使用して、端末のアプリケーション専用の保存領域(Context.getFilesDir().getPath())に

音声ファイルを保存したのち、その保存した音声ファイルを MediaPlayer で再生しようとしたら以下のエラーが発生した。

04-23 10:02:41.199: E/Astros(861): playing. : java.io.IOException: Prepare failed.: status=0xFFFFFFFC



実装は以下のような感じ

MediaPlayer player = new MediaPlayer();
try {
// 再生ファイルをセット
player.setDataSource(getFilesDir().getPath() + "/sample.3gp");
player.prepare(); // 再生準備
player.start(); // 再生開始
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


【原因】
MediaPlayer にはアプリケーション専用の保存領域にアクセスする権限が無いことのようです。

※ちなみに、エミュレータの場合、上記の実装(MediaPlayer にファイル直指定)でも怒られずに再生できた。

 端末依存なのか?root権限がある端末なら問題ないのか?



【解決策】
FileInputStream を使って開いて、FileDescriptor を取得し、setDataSource() には FileDescriptor をセットすることで
MediaPlayer が直接ファイルを開くのを回避することができます。


MediaPlayer player = new MediaPlayer();
FileInputStream fis = null;
try {
// 再生ファイルをセット
fis = new FileInputStream(new File(getFilesDir().getPath() + "/sample.3gp"));
FileDescriptor fd = fis.getFD();
player.setDataSource(fd);
player.prepare(); // 再生準備
player.start(); // 再生開始
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

MediaRecorder、MediaPlayer を使用した録音/再生は、大抵SDカードへ保存するようにするため、
MediaPlayer がアプリケーション領域にアクセスできないことは不自由とされていないのかな。
FileInputStream で回避もできますしね。


以下のサイトを参考にさせていただきました。
http://www.anddev.org/media_player_prepare_error-t4309.html

コメントの投稿

非公開コメント

プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。