Androidのアプリで静止画や動画を生成した時に、MediaStoreへ登録しないと生成した静止画・動画を見れないアプリがあります。ファイラー系のアプリで生のファイルシステム上のファイルとしては存在するのに、ギャラリー系のアプリでは見れない、そういう時の殆どはMediaStoreへ登録されていないからなのです。
MediaStoreへ登録する方法はいくつかありますが、一番お手軽なのは、MediaScannerConnection.scanFileを呼ぶことです。例えば次のように呼ぶだけで桶。
1 |
MediaScannerConnection.scanFile(context, new String[] { ファイルパス }, null, null); |
後ろから2つ目の引数、mimeTypesをnullにすると、拡張子からよきに計らってくれます。
一番後ろの引数、OnScanCompletedListenerもnullにできますが、ファイルのスキャン完了のタイミングを知りたい時にはセットしましょう。
こんなお手軽なMediaScannerConnection.scanFileですが、幾つかの機種、例えばZenPad8.0(Z380M)だと時としてMediaStoreへの登録に失敗することがあります。
OnScanCompletedListenerを付けて、「スキャンが完了したぜぇ」と返ってきたことを確認してもです。
ContentResolverを使って登録できたかどうか確認することはできますが、それではMediaScannerConnection.scanFileを使う意味がありません。最初からContentResolver#insertで追加すればいいという話になってしまいます。でもサムネイル生成したり色々面倒じゃん。
色々試した結果、ファイル自体への書き込みが終了してcloseしていても、実ファイルへの出力はバッファリングされているので、実ファイルへの出力が終了する前にMediaScannerConnection.scanFileを呼ぶとMediaStoreへの登録に失敗する機種があるようです。
ということで、静止画・動画を生成した後でMediaScannerConnection.scanFileを呼ぶ時は、少し待ってあげましょう。
ちゃんちゃん(^o^)