初めて投稿します。今日は、先日リリースしたぐっすリンを開発する上ではまったMediaPlayerの落とし穴について話したいと思います。

 

ぐっすリンでは音を同時再生して音を組み合わせる機能があり、それをMediaPlayerを複数使って 実現しています。

また、音の種類が豊富で全43種類あります。そのためアプリの容量が60MBくらいになってしまい、Google Playにアップロードできなくなってしまいました。

考えた結果、音ファイルは別途サーバに置き、初回起動時に取得するようにしました。

サーバから取得したファイルは

/data/data/{アプリ毎領域}/files/

に置くようにしました。実装後、Nexus5で一通り動作確認して問題なさそうだったのでXperia(OS 4.0)でも動作確認してみたら・・・

落ちた。なぜだろうと思ったら、MediaPlayerのインスタンスが作られてなくて落ちてました。

ログを見てみると


<span class="pun" style="color: #000000;">E/MediaPlayer(21268): error (1,-2147483648)</span>

調べてみると参照したいファイルの読み取り権限がないと上記のようなエラーが出るようでした。

OS4.1, 4.2の端末で試してみたら問題なく再生できたので4.0の端末で発生する問題のようでした。

試行錯誤した結果、サーバからデータを取得するときに

 

bos = new BufferedOutputStream(new FileOutputStream(file));

となっていたところを

if (Build.VERSION.SDK_INT &amp;amp;amp;amp;amp;amp;amp;amp;lt;= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
 bos = new BufferedOutputStream(context.openFileOutput(getFileName(entry.getName()), Context.MODE_WORLD_READABLE));
} else {
 bos = new BufferedOutputStream(new FileOutputStream(file));
}

このようにサーバから取得して保存するときに権限を変えてあげると4.0でも再生することができました。
MODE_WORLD_READABLEはすべてのアプリからアクセスできてしまうのでセキュリティ上あまりよろしくありませんが、他に良い方法が見つかりませんでした。

時間があるときに改善したいと思います。

Post Navigation