2013-05-06 46 views
5

我的應用程序使用DownloadManager從網站下載jpgs,並將它們存儲在/sdcard/Android/name.app/目錄中,以便在應用程序中的多個片段中使用。然而,下載的效果很好,jpgs在Gallery應用程序中是可見的,我不想要,因爲它們只是我的應用程序的資源。我無法弄清楚如何讓它們不會出現在Gallery應用程序中。我甚至嘗試添加.nomedia文件到它們被創建的目錄。任何幫助,將不勝感激!防止媒體掃描器掃描JPG下載Android上的DownloadManager? (開發人員)

DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE); 
    Request myRequest = new Request(Uri.parse(episodeArtLink)); 
    myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
    myRequest.setVisibleInDownloadsUi(false); 
    myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename); 
    myDownloadManager.enqueue(myRequest); 

的問題,似乎因爲MediaScanner被添加到圖像,即使我沒有要求它到系統數據庫中造成的。

我已經創建了一個測試應用程序來演示這個問題。如果您點擊下載按鈕,Google徽標將顯示在應用程序中。如果您進入Gallery應用,您還應該在名爲「下載」的圖庫中看到Google徽標。如果您轉到設置 - >應用並清除圖庫和媒體存儲的數據,那麼Google徽標將消失,並且不會再顯示在圖庫中,因爲該文件位於/ sdcard/Android/data /下,受到.nomedia文件。您可以前往/sdcard/Android/data/com.example.downloadmanagertest/files/Download/以確認圖像仍在電話中。即使重新啓動後,如果您清除「圖庫和媒體存儲數據」,圖像也不會顯示在圖庫中。我已經在運行4.2.2的Nexus 4和Nexus 7上測試了這一點。

來源:以點(/sdcard/Android/name.app/.photos/)https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

我認爲這個問題應該更「通用」。當我安裝TomTom時,我遇到了類似的問題:我的畫廊中出現了數千個圖標!有沒有辦法從畫廊中完成「隱藏」文件夾? – AndreaCi 2013-05-06 08:06:54

+0

這不是針對我下載的應用程序,而是針對我正在開發的應用程序。我不希望下載應用程序的所有人都必須自行尋找解決方法。 – notkevin 2013-05-06 14:47:07

+0

您是否嘗試將圖像下載到不包含媒體文件的文件夾(名稱爲.nomedia的文件)?此文件必須阻止掃描文件夾中的文件。 – 2013-05-08 14:43:13

回答

5

解決方案

媒體掃描儀將最終遲早掃描媒體和索引他們的媒體卡。第一個直觀的步驟是誘使掃描儀不知道該文件是媒體文件。這可以通過保存沒有擴展名的圖像來實現。一個簡單的解決方案是將notkevin附加到文件名的末尾。簡單地說:

而不是

myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment()); 

使用此

String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin"; 
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename); 

但是,由於您使用的下載管理器(只是猜測),這是不是你的情況就足夠了。媒體掃描器以某種方式知道下載的項目以及它是一個圖像的事實,並因此將其編入索引。要禁止它,使用setMimeType這樣的:

myRequest.setMimeType("application/octet-stream"); 

PS:有辦法改變不是增加你的還是我的名字的文件名末尾其他擴展。例如,你可以散列文件名

String filename = hash(Uri.parse(downloadLink).getLastPathSegment()); 

public String hash(String victim) throws NoSuchAlgorithmException 
{ 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    md.reset(); 
    byte[] buffer = victim.getBytes(); 
    md.update(buffer); 
    byte[] digest = md.digest(); 

    StringBuilder hexStr = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     hexStr.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return hexStr.toString(); 
} 
+1

謝謝!看來你的解決方案解決了這個問題。我最終將文件保存到設備而沒有.jpg擴展名。 – notkevin 2013-05-09 15:43:39

0

前綴的文件夾名稱。如果這不起作用,請嘗試隱藏您的文件夾。

+0

我已經嘗試將文件下載到像.photos這樣的目錄,但仍然無法正常工作。即使我沒有設置allowScanningByMediaScanner(),DownloadManager仍在將文件添加到MediaScanner中。如果我刪除了媒體存儲應用程序的存儲空間,則不會再找到這些圖像。如何防止MediaScanner在下載圖像時看到圖像? – notkevin 2013-05-06 22:48:37

0

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

來看看有像getphoto,getbitmap在上面的鏈接名稱的方法。LazyLoader github項目提供了使用其他答案中的建議來將所有媒體從WEB,緩存(內存,文件系統)以及根據需要在您的應用中使用位圖所需的所有方法。

在位圖持續存在的文件鏈中,只需使用fileNames,它將被模塊識別爲需要,但媒體掃描程序不能識別。

應該這樣做。

2

我幾天來一直在這個相同的問題。我已經嘗試過幾乎所有創建hidden directories,using different extensions,將.nomedia文件放入root and image directories directories,創建.nomediabefore the download,renaming directory (back and forth)的所有組合。

不幸的是,這些似乎都沒有爲我工作(在Nexus 4上)。我的理解是,只有在啓動手機或安裝外部存儲設備時,MediaScanner纔會進行重新掃描。在Nexus 4(或沒有SD卡插槽的任何設備)中,此安裝僅在啓動時發生。

但是,立即掃描與Android Download Manager一起下載的文件(即使它們是shouldn't),並將其放入圖庫中。即使您擁有.nomedia文件,它們仍然會在圖庫中結束。卸載應用程序並沒有幫助,因爲他們的縮略圖仍然被緩存(您可以通過清除緩存,數據和強制關閉設置中的圖庫和媒體存儲應用程序來重新啓動而刪除它們)。如果您重新啓動手機,Android會重新掃描外部存儲,請看到有一個.nomedia文件,然後將其從相冊中刪除。

所以這個重新啓動/重新掃描有點解決了這個問題。但是,我們並不希望被不斷要求用戶重新啓動手機這樣反而什麼工作對我來說是給力的Android與下載成功後,重新掃描外部存儲:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

這是我從Darshan's答案到了一個類似的問題和Jon

我設置了一個廣播接收機來收聽已完成的downloads,如果他們成功我發送廣播。似乎工作 - 在我的應用程序下載的圖像不再出現在畫廊。

0

您也可以讓您的整個文件夾不受掃描儀觸摸,而無需更改文件擴展名。請參考link中的「.nomedia」文件;

從媒體掃描儀

隱藏文件包括您的外部文件的目錄 名爲.nomedia一個空文件(注意文件名中的點前綴)。這樣可以防止媒體掃描器 讀取媒體文件並通過MediaStore內容提供商向 提供給其他應用程序。但是,如果您的文件真的是您的應用程序專用的 ,則應將其保存在應用程序專用目錄中。