読者です 読者をやめる 読者になる 読者になる

のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

【解決済】音楽、動画ファイルをコピーてもギャラリーに表示されない

android 自作ソフト/パッチ

こんな経験ないですか?

ndroid搭載のスマートフォンタブレット端末をお使いの方でこんな経験をされた方はいらっしゃいませんか?

  • 音楽、動画、画像ファイルを端末にコピーしたんだけど、再生アプリが表示してくれない
  • アプリを使ってネットからダウンロードしたファイルをUSB経由でパソコンに転送しようとしたけど、肝心のファイルが見つからない

Android端末のシステム内部に存在する「メディアストレージ」という情報に不具合が発生すると、このようなことが起きる可能性があります。

メディアストレージとは?

音楽ファイルには、音楽データのほかに、曲名、アルバム名、アルバムのジャケット画像、作曲者や曲の長さ等の情報が含まれています。

動画ファイルにも、動画データのほかに、動画のサイズ、撮影者、動画の長さなどの情報が含まれています。

画像(写真)ファイルにも、撮影場所、撮影日、撮影時のカメラの向きなどの情報が含まれています。

再生アプリなどでファイルの一覧を表示したとき、これらの情報を一つずつ読み込んでいると表示までに時間がかかってしまうので、ファイルが作られたタイミングでこれらの情報をひとまとめにして事前に保存しておきます。

そうすることで、再生アプリで音楽ファイルの一覧画面を表示するときや、特定の日付に撮影した写真一覧を表示するとき等に、すべてのファイルを読まずにあらかじめ保存されていた情報を参照すればよく、結果を素早く表示させることができるようになっています。

この情報が欠けていたり間違っていた場合、再生アプリなどは正しい情報を表示することができなくなってしまいます。

また、この情報はandroid端末とパソコンをUSBで繋いだ時にも参照されます。この情報に不整合があると、パソコンで端末内のファイルを表示したときに、ファイルが表示されない、正しくコピーできないなどの不具合が発生します。

media Re.Scan. の紹介

この問題を解決するためのアプリ「media Re.Scan.」というアプリを公開しました。

play.google.com
このアプリを使うと、ギャラリーや音楽・動画再生アプリ等の以下の様な症状を改善します。

  • 最近追加したファイルが表示・再生できない。
  • 削除したファイルがリストに残ったままになっている。表示、再生しようとしてもやっぱりエラーがでてしまう。
  • 同じファイルがいくつも表示されてしまう(メディアストレージデータの消去を行ってください)

アプリを起動すると、画面の上半分に「画像」「音楽」「動画」「その他」のチェック付きリストが表示され、画面左下に「スキャン開始」ボタンが表示されます。

スキャン開始ボタンをタップすれば、数分ほど(時間は端末の容量やファイルの数によって変わります)でSDカードをスキャンし、メディアストレージの情報を正しい状態に更新します。

作成に至った経緯

実は、この機能を持つアプリ、すでに多くのアプリがリリースされているのですが、僕が試した限り、既存のアプリは全て、手持ちのandroid4.4系端末では動作しませんでした

そこで、そんなに手間もかからなそうだったので、自分で作ってみることにシました*2

ついでなので、既存アプリがandroid4.4で動かなくなってしまった理由を簡単に紹介します。

以下、内部実装等について興味のある方向けです。
既存のアプリがどうやってメディアスキャンをしていたか

どのアプリも、大体中身は一緒です。

これらのアプリは、メディアスキャンボタンが押されたタイミングで、SDカードが、一旦取り外されて、再度挿入された時に(本来はOSから送られる)メッセージをメディア一覧を管理しているアプリ(メディアストレージといいます)に送信していました。

これにより、メディアストレージアプリは、SDカード全体を再スキャンし、メディアファイル一覧を作りなおしていました。
android4.4ではなぜ動かないのか

SDカードが再接続された時に送られるメッセージは、android 4.4 では一般のアプリから送ることができなくなってしまいました。

SDカードが実際に取り出されたわけではないので、そのメッセージを勝手に普通のアプリが使うのはおかしいし、副作用でおかしな挙動をするかもしれないという理由からの仕様変更かと思います。

media Re.Scan.では、現在メディア一覧として登録されているファイルがちゃんとSDカードに存在するか?追加、変更されたファイルはないか?ということを自前で確認し、メディア一覧の情報を1つづつ更新する方法をとっています。