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?

¿Fue útil?

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.

  1. No explotar la aplicación y la memoria.
  2. Se elimina la base de datos relacionada, una vez se desinstala la aplicación.
  3. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top