Dónde guardar imágenes en Android?
Pregunta
Mi aplicación utiliza un buen montón de imágenes que se descargan de Internet y la memoria caché local en el teléfono Android. Me pregunto, ¿cuál es la forma correcta de guardarlas. Hay varias maneras que veo, que no son totalmente satisfactorias.
guardarlos en la tarjeta SD en una carpeta pública
- Utiliza un espacio que no será liberado el desinstalación
- El usuario puede ver las fotografías en la Galería
- Necesidades una carpeta en la raíz sdcard (en realidad se puede ver que durante la navegación por el teléfono)
guardarlos en la tarjeta SD en una carpeta que no sea pública
- Utiliza un espacio que no será liberado el desinstalación
- En secreto utiliza el espacio en la tarjeta SD
Guardar ellas dentro de la aplicación
- explota tamaño de la aplicación demasiado
¿Cuál es la forma correcta de guardar localmente las imágenes de mi solicitud para no distrae al usuario y no dejan la basura en cualquier lugar?
Solución
La mejor solución es utilizar:
context.getCacheDir()
Este directorio es privado para la aplicación y se eliminará en la desinstalación, además, el sistema puede eliminar de este directorio si el dispositivo está quedando sin espacio.
Ten en cuenta que los documentos dicen:
no se debe confiar en el sistema eliminar estos archivos para usted; tú siempre debe tener una razonable máximo, tal como 1 MB, para la cantidad del espacio que consume con los archivos de caché, y podar esos archivos cuando se superan que el espacio
Si necesita mucho espacio y prefiere utilizar la tarjeta SD, puede llamar
getExternalCacheDir()
lugar. Estos también se eliminan de desinstalación, pero el sistema no supervisa el espacio disponible en el almacenamiento externo, por lo que no van a eliminar automáticamente estos archivos si poco espacio. Si se utiliza esta opción también se debe comprobar que el almacenamiento externo está disponible con
Environment.getExternalStorageState()
antes de intentar escribir en él.
Otros consejos
Puede ocultar las imágenes de la MediaScanner si ponerlo en un oculto dir (es decir, con un punto prefijado) como /sdcard/.donotscan/
.
Actualización: Como romainguy menciones en twitter Esto también funciona si se pone un archivo .nomedia
nombrado en el directorio.
Creo que la mejor manera es utilizar la base de datos.
- No explotar la aplicación y la memoria.
- Se elimina la base de datos relacionada, una vez se desinstala la aplicación.
- Nadie puede llegar a estos archivos, además de su aplicación.
Actualización: Pero; Si desea almacenar en caché sólo los datos, hay un administrador de caché se define en WebKit. CacheManager
yo no usar el paquete antes, pero los métodos parece sencillo de usar:
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()
y se puede encontrar el uso en Google Gears código
Espero que esto ayude.
Si usted no desea utilizar el CacheManager continuación, utilizar un archivo local (no-SD) o la base de datos (archivos locales se eliminan en una desinstalación completa) y registrarse para recibir el 'ACTION_DEVICE_STORAGE_LOW' y difusión 'ACTION_DEVICE_STORAGE_OK' comportamiento. Entonces sabrá cuando su aplicación está tomando demasiado espacio en función del dispositivo y cuando se necesita para empezar a borrar las imágenes. El tamaño de su aplicación aún crecerá, pero usted será capaz de gestionar el crecimiento y contracción.
Sólo un consejo - si los guarda en la tarjeta SD, que serán analizados por el MediaScanner y aparecerán en los usuarios de la Galería (fotos), que es probable que no desee. Así que es probable que desee almacenar en el teléfono, o de alguna manera decirle MediaScanner no escanearlos (aparentemente imposible después de una rápida búsqueda en Google.)
Probablemente la mejor manera de almacenar unos pocos elegidos en el directorio privado de su aplicación, que se elimina cuando se desinstala la aplicación.