2012-12-05 17 views
2

MediaScanner似乎想掃描我不告訴它的文件。現在我想知道爲什麼。DownloadManager在下載後運行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'. 

所以很顯然,我的應用程序告訴下載管理器下載的圖像/到「待定」目錄中的視頻。它按照它的要求發送併發送「我完成了下載」廣播。我的應用程序接收到廣播並將完整的文件移動到「媒體」目錄。一段時間後,MediaScanner(或其他)嘗試掃描「待處理」文件夾中的完成文件和barfs到系統日誌中。

現在我想知道:爲什麼MediaScanner試圖讀取這些文件?


根據對setDestinationUri Android的API文檔:「下載的文件不被MediaScanner掃描但它可以通過調用allowScanningByMediaScanner()進行掃描的。」我不會調用該方法,因此不應掃描下載的文件。

接下來,我試圖把一個空.ignore在應用程序的cache directory,並通過ACTION_MEDIA_SCANNER_SCAN_FILE提醒.IGNORE文件的存在的MediaScanner,但錯誤信息仍然存在。

要增加神祕感,文件不會顯示在系統的圖庫或視頻應用程序中,所以是的,媒體掃描儀會忽略它們。但仍然:爲什麼它會在不需要時閱讀它們?完全是MediaScanner還是其他系統服務?

回答

1

接下來,我試圖把一個空.IGNORE在應用程序的緩存目錄,並通過ACTION_MEDIA_SCANNER_SCAN_FILE提醒.IGNORE文件的存在的MediaScanner,但錯誤信息仍然存在。

神奇的文件停止Mediascanner不是 「.IGNORE」,而是 「.nomedia」。
從MediaScanner。Java的:

File file = new File(path.substring(0, slashIndex) + ".nomedia"); 
if (file.exists()) { 
    // we have a .nomedia in one of the parent directories 
    return true; 
} 

,爲什麼它沒有出現在系統的畫廊或視頻應用程序的原因也許是,因爲掃描崩潰(如日誌中所示)。

但是,我對媒體掃描儀也有不好的感受。例如,爲什麼它不能以更直接的方式停止掃描。例如,在MediaScanner.java,而不是

public void scanDirectories(String[] directories, String volumeName) { 
     [...] 
     for (int i = 0; i < directories.length; i++) { 
      processDirectory(directories[i], mClient); 
     } 

它可能是

public void scanDirectories(String[] directories, String volumeName) { 
     [...] 
     for (int i = 0; i < directories.length; i++) { 
      if (! isNoMediaPath(directories[i])) 
       processDirectory(directories[i], mClient); 
     } 

但是,相反,它會提出和Java代碼和CPP代碼之間連連後退。這是什麼原因?

+0

好的,對不起。我使用這個 'File ignore = new File(context.getExternalCacheDir(),MediaStore.MEDIA_IGNORE_FILENAME);' 因此它是一個名爲.nomedia,不是.ignore的文件 - 但仍然無效。 – hez

0

它真的看起來像「.nomedia」不會給人一些預期效果的一半。在MediaScanner.java中進一步調查之後,我會說,這個文件並沒有阻止MediaScanner掃描整個樹。它仍然向每個文件的MediaStore添加條目,不介意設置noMedia或不設置。

它只是將MediaStore中的條目標記爲「不能顯示」。在每個文件上,它執行「beginFile」和「endFile」。在結束文件中,它始終會執行一個mMediaInserter.insert,這是另一種方式。

這讓我感到困擾的事實是,它掃描了所有文件。因此冒着陷入病毒的危險(專門爲該掃描過程設計的)並且沒有.nomedia文件可以阻止它進行。

相關問題