2013-05-06 10 views
5

La mia applicazione scarica jpg da un sito Web utilizzando DownloadManager e li memorizza nella directory /sdcard/Android/name.app/ da utilizzare in diversi frammenti nell'applicazione. Il download funziona benissimo, tuttavia i jpg sono visibili nell'applicazione Gallery, che non desidero poiché sono solo risorse per la mia applicazione. Non riesco a capire come ottenerli non vengano visualizzati nell'applicazione Galleria. Ho anche provato ad aggiungere file .nomedia alle directory in cui sono stati creati. Qualsiasi aiuto sarebbe apprezzato!Prevenzione dello scanner multimediale dai file JPG di scansione scaricato con DownloadManager su Android? (Sviluppatore)

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); 

I problemi sembrano essere causati a causa MediaScanner sta aggiungendo le immagini al database del sistema, anche se non ho chiesto a.

Ho creato un'applicazione di test che dimostra il problema. Se fai clic sul pulsante Scarica, il logo di Google verrà visualizzato nell'app. Se vai nell'app Galleria, dovresti vedere anche il logo di Google in una galleria chiamata Download. Se vai in Impostazioni -> App e cancella i dati per la Galleria e lo spazio di archiviazione dei media, il logo di Google sarà scomparso e non verrà più visualizzato nella Galleria perché il file è in/sdcard/Android/data/che è protetto dal .nomedia file. Puoi andare su /sdcard/Android/data/com.example.downloadmanagertest/files/Download/ per verificare che le immagini siano ancora sul telefono. Anche dopo il riavvio, le immagini non vengono visualizzate nella Raccolta se si cancellano i Dati per Galleria e Archiviazione supporti. Ho provato questo sia su un Nexus 4 che su un Nexus 7 con 4.2.2.

Fonte

: https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

Penso che questa domanda dovrebbe essere più "generica". Ho avuto un problema simile quando ho installato TomTom: migliaia di icone sono apparse nella mia galleria! C'è un modo per completare "nascondere" una cartella dalla galleria? – AndreaCi

+0

Questo non è per un'applicazione che ho scaricato è per un'applicazione che sto sviluppando. Non voglio che tutti quelli che hanno scaricato l'applicazione debbano trovare un lavoro da soli. – notkevin

+0

Hai provato a scaricare le immagini nella cartella, che non contiene file multimediali (file con nome .nomedia)? Questo file deve impedire la scansione dei file nella cartella. –

risposta

5

Soluzione

Lo scanner supporti finirà prima o poi eseguire la scansione della scheda di memoria per i media e indicizzarli. Il primo passo intuitivo è ingannare lo Scanner nel non sapere che il file è un file multimediale. Questo può essere ottenuto salvando le immagini senza l'estensione. Una soluzione facile sarebbe quella di aggiungere notkevin alla fine del nome file. Semplicemente:

Invece di

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

Utilizzare questa

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

Tuttavia questo non è sufficiente nel vostro caso, poiché si utilizza il DownloadManager (solo una supposizione). Lo scanner multimediale in qualche modo conosce l'oggetto scaricato e il fatto che sia un'immagine e, quindi, lo indicizza. Per non permettere, utilizzare setMimeType come questo:

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

PS: Ci sono modi per modificare l'estensione altro che aggiungere il tuo o il mio nome alla fine del nome del file. Ad esempio, è possibile il nome del file hash

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

Grazie! Sembra che la tua soluzione abbia risolto il problema. Ho finito per salvare i file sul dispositivo senza l'estensione .jpg. – notkevin

0

prefisso il nome della cartella con un punto (/sdcard/Android/name.app/.photos/). Se ciò non funziona, prova a nascondere la cartella.

+0

Ho provato a scaricare i file in una directory come .photos ma non funziona ancora. Anche se non ho impostato allowScanningByMediaScanner(), DownloadManager sta ancora aggiungendo i file a MediaScanner. Se elimino la memoria per l'app Media Storage, non trova più le immagini. Come posso impedire a MediaScanner di visualizzare le immagini mentre vengono scaricate? – notkevin

0

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

Guarda i metodi con nomi come getphoto, getbitmap nel link qui sopra.Il progetto github di LazyLoader ha tutti i metodi di cui avresti bisogno per cercare usando suggerimenti in altre risposte per portare i media dal WEB, per memorizzare nella cache (memoria, Filesystem) e per usare le bitmap che ti servono nella tua app.

Negli archivi, dove persistono le bitmap, basta adottare nomi file che verranno riconosciuti come necessari dai moduli MA NON RICONOSCERE dallo scanner di supporti.

che dovrebbe farlo.

2

Sono stato a questo stesso problema per alcuni giorni. Ho provato praticamente tutte le combinazioni di creazione di hidden directories, using different extensions, mettendo i file .nomedia in root and image directories directories, creando lo .nomediabefore the download, renaming directory (back and forth).

Sfortunatamente nessuno di questi sembra funzionare per me (sul Nexus 4). La mia comprensione è che MediaScanner esegue una nuova scansione solo all'avvio del telefono o al montaggio della memoria esterna. In un Nexus 4 (o qualsiasi dispositivo che non ha uno slot per schede SD) questo montaggio avviene solo al momento del lancio.

Tuttavia i file scaricati con Android Download Manager vengono immediatamente scansionati (anche se sono shouldn't) e inseriti nella galleria. Anche se hai il file .nomedia, terminano ancora nella galleria. La disinstallazione dell'app non aiuta quando le anteprime sono ancora memorizzate nella cache (è possibile rimuoverle senza riavviare svuotando la cache, i dati e forzando la chiusura delle app Gallery e Media Storage nelle impostazioni). Se riavvii il telefono, Android riscatterà la memoria esterna, vedrà che c'è un file .nomedia e quindi lo rimuove dalla galleria.

Quindi questo riavvio/ricerca un tipo risolve il problema. Tuttavia non vogliamo essere costantemente chiedendo agli utenti di riavviare il telefono in modo invece che cosa ha funzionato per me era quello di costringere Android ricaricare la memorizzazione esterno dopo download di successo con:

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

che ho ricevuto da Darshan's risposta a una domanda simile e Jon.

Ho impostato un ricevitore di trasmissione per ascoltare per completato downloads e se hanno esito positivo invio la trasmissione. Sembra funzionare - le immagini scaricate nella mia app non compaiono più nella galleria.

0

Si può anche mettere l'intera cartella intatta dallo Scanner senza modificare le estensioni dei file. Si prega di fare riferimento al file ".nomedia" in questo link;

nascondere i file dalla Media Scanner

includere un file vuoto denominato .nomedia nella vostra directory di file esterni (notare il prefisso dot nel nome del file). Ciò impedisce allo scanner multimediale di leggere i file multimediali e di fornirli ad altre app tramite lo provider di contenuti MediaStore. Tuttavia, se i tuoi file sono veramente privati ​​della tua app, devi salvarli in una directory privata dell'app.

Problemi correlati