Dove salvare le immagini su Android?
Domanda
La mia applicazione utilizza un bel po 'di immagini che vengono scaricati da internet e nella cache localmente sul telefono Android. Mi chiedo, qual è il modo corretto per salvare quelle immagini. Ci sono diversi modi che vedo, che non sono pienamente soddisfacenti.
Salva loro su scheda SD in una cartella pubblica
- Utilizza lo spazio che non sarà liberato su Disinstalla
- L'utente può visualizzare le foto nella Galleria
- ha bisogno di una cartella nella directory principale sdcard (si può effettivamente vedere che durante la navigazione il telefono)
Salva loro su scheda SD in una cartella non pubblica
- Utilizza lo spazio che non sarà liberato su Disinstalla
- utilizza Segretamente spazio sulla scheda SD
Salvarle all'interno dell'applicazione
- fa esplodere le dimensioni delle applicazioni troppo
Qual è il modo corretto di salvare in locale le immagini della mia applicazione per non distrarre l'utente e non lasciare spazzatura ovunque?
Soluzione
La soluzione migliore è quella di utilizzare:
context.getCacheDir()
Questa directory è privato per l'applicazione e verrà eliminato il disinstallazione, inoltre, il sistema può eliminare da questa directory per voi, se il dispositivo è in esecuzione a corto di spazio.
Nota però che i documenti dicono:
non si dovrebbe fare affidamento sul sistema eliminazione di questi file per voi; voi dovrebbe sempre avere una ragionevole massima, ad esempio 1 MB, per l'importo di spazio che si consumano con i file di cache, e potare i file in caso di superamento che lo spazio
Se avete bisogno di un sacco di spazio e preferisce utilizzare la scheda SD è possibile chiamare
getExternalCacheDir()
, invece. Questi saranno anche ottenere rimosso su disinstallazione, ma il sistema non controlla lo spazio disponibile nella memoria esterna, in modo da non eliminare automaticamente questi file se a corto di spazio. Se si utilizza questa opzione si dovrebbe anche verificare che l'archiviazione esterna è disponibile con
Environment.getExternalStorageState()
prima di tentare di scrivere su di esso.
Altri suggerimenti
È possibile nascondere le immagini dalla MediaScanner se metterlo in una nascosta dir (cioè, con un punto prefissato) come /sdcard/.donotscan/
.
Aggiornamento: Come romainguy menzioni su Twitter questo funziona anche se si mette un file chiamato .nomedia
nella dir.
Penso che il modo migliore è quello di utilizzare il database.
- Non ha saltare in aria l'applicazione e la memoria.
- Il database correlato viene eliminato una volta che l'applicazione viene disinstallata.
- Nessuno può arrivare a questo file oltre l'applicazione.
Aggiornamento: Ma; Se si desidera memorizzare nella cache solo i dati, v'è un gestore di cache definita in WebKit. CacheManager
non ho usato il pacchetto prima ma i metodi sembra semplice da usare:
static boolean cacheDisabled()
static boolean endCacheTransaction()
static CacheManager.CacheResult getCacheFile(String url, Map<String, String> headers)
static File getCacheFileBaseDir()
static void saveCacheFile(String url, CacheManager.CacheResult cacheRet)
static boolean startCacheTransaction()
e si può trovare l'uso di in Google Gears codice
Spero che questo aiuta.
Se non si desidera utilizzare il CacheManager quindi utilizzare un un file locale (non-SD) del database o (file locali vengono eliminati su una disinstallazione completa) e registrarsi per ricevere il 'ACTION_DEVICE_STORAGE_LOW' e broadcast 'ACTION_DEVICE_STORAGE_OK' Azioni. Allora saprete quando l'applicazione sta prendendo troppo spazio a seconda del dispositivo e quando è necessario iniziare a eliminare le immagini. La dimensione dell'applicazione sarà ancora crescere, ma si sarà in grado di gestire la crescita e contrazione.
Un suggerimento - se li si salva sulla scheda SD, saranno sottoposti a scansione dal MediaScanner e appariranno nei di utenti Galleria (foto), che probabilmente non si vuole. Quindi probabilmente si desidera memorizzare loro al telefono, o in qualche modo dire MediaScanner di non eseguire la scansione di loro (apparentemente impossibile dopo una rapida ricerca su Google.)
Probabilmente la cosa migliore per memorizzare pochi eletti nella directory privata dell'applicazione, che verrà rimosso quando l'applicazione viene disinstallata.