MediaScanner は、スキャンしないように指示したファイルをスキャンしようとしているようです。なぜだろう。
私のアプリは、サーバーからいくつかのメディア ファイルをダウンロードし、後でそれらをプレイリストと共に表示します。
そのために、アプリは Android システムのDownloadManagerを使用してメディア ファイルを取得します。
Request.setDestinationUri()を使用すると、ダウンロードは「pending」という名前のgetExternalCacheDir()のサブディレクトリに保存されます。
ダウンロードが完了すると、Android DownloadManager はACTION_DOWNLOAD_COMPLETEブロードキャストを送信します。私のアプリのブロードキャスト リスナーは、その完了したダウンロードを取得し、「保留中」フォルダーから「メディア」という名前の別のフォルダーに移動します。
これはすべて意図したとおりに機能します。
ただし、システム ログには次のようなメッセージがいっぱいです。
E/BitmapFactory(23779): Unable to decode stream: java.io.FileNotFoundException: /path/to/pending/image.jpg: open failed: ENOENT (No such file or directory)
E/JHEAD (23779): can't open '/path/to/pending/image.jpg'
E/StagefrightMetadataRetriever(25911): Unable to create data source for '/path/to/pending/video.mp4'.
E/MediaScannerJNI(23779): An error occurred while scanning file '/path/to/pending/video.mp4'.
どうやら、私のアプリはDownloadManagerに画像/ビデオを「保留中」ディレクトリにダウンロードするように指示しています。言われたとおりに「ダウンロードを完了しました」ブロードキャストを送信します。私のアプリはブロードキャストを受信し、完全なファイルを「メディア」ディレクトリに移動します。しばらくして、MediaScanner (またはその他のもの) は、「保留中」フォルダー内の完成したファイルをスキャンし、システム ログに barfs しようとします。
MediaScanner がこれらのファイルを読み込もうとしているのはなぜですか?
setDestinationUriの Android API ドキュメントによると、「ダウンロードしたファイルは MediaScanner によってスキャンされません。ただし、allowScanningByMediaScanner() を呼び出すことでスキャン可能にすることができます。」私はそのメソッドを呼び出していないので、ダウンロードしたファイルはスキャンされるべきではありません。
次に、アプリのキャッシュ ディレクトリに空の.ignoreを配置しようとしましたが、 ACTION_MEDIA_SCANNER_SCAN_FILEを介して MediaScanner に .ignore-file の存在を思い出させましたが、エラー メッセージは残ります。
さらに不思議なことに、ファイルはシステムのギャラリーやビデオ アプリには表示されないため、メディア スキャナーはファイルを無視します。しかし、それでも: 読む必要がないのに、なぜ読もうとするのでしょうか? MediaScanner ですか、それとも他のシステム サービスですか?