Où enregistrer les images sur Android?
Question
Mon application utilise beaucoup d'images qui sont téléchargées sur Internet et mises en cache sur le téléphone Android localement. Je me demande, quelle est la bonne façon de sauvegarder ces images. Il y a plusieurs façons que je vois, qui ne sont pas entièrement satisfaisant.
Enregistrez-les sur la carte SD dans un dossier public
- Utilise l'espace qui sera libéré lors de la désinstallation wont
- L'utilisateur peut voir les photos dans la galerie
- a besoin d'un dossier sur la racine de sdcard (vous pouvez réellement voir tout en naviguant sur votre téléphone)
Enregistrez-les sur la carte SD dans un dossier non-publique
- Utilise l'espace qui sera libéré lors de la désinstallation wont
- utilise Secrètement l'espace sur la carte SD
Enregistrez-les dans l'application
- fait exploser la taille des applications beaucoup trop
Quelle est la bonne façon de sauver localement les images de ma demande de ne pas détourner l'attention de l'utilisateur et ne laissent pas les ordures partout?
La solution
La meilleure solution consiste à utiliser:
context.getCacheDir()
Ce répertoire est privé à l'application et sera supprimé lors de la désinstallation, en outre, le système peut supprimer de ce répertoire pour vous si l'appareil est en cours d'exécution à court d'espace.
Notez bien que les documents disent:
vous ne devriez pas compter sur le système la suppression de ces fichiers pour vous; toi devrait toujours avoir un raisonnable maximale, par exemple de 1 Mo, pour le montant de l'espace que vous consommez avec des fichiers de cache, et élaguer les fichiers en cas de dépassement cet espace
Si vous avez besoin de beaucoup d'espace et préférez utiliser la carte SD, vous pouvez appeler
getExternalCacheDir()
au lieu. Ceux-ci seront également supprimeront lors de la désinstallation, mais le système ne surveille pas l'espace disponible dans le stockage externe, donc ne supprime pas automatiquement ces fichiers si peu d'espace. Si vous utilisez cette option, vous devez également vérifier que le stockage externe est disponible avec
Environment.getExternalStorageState()
avant d'essayer d'écrire.
Autres conseils
Vous pouvez si vous mettre dans telle que dir cachée (par exemple, avec un point préfixé) /sdcard/.donotscan/
.
Mise à jour: Comme romainguy mentions sur twitter cela fonctionne aussi si vous mettez un fichier nommé dans le répertoire .nomedia
.
Je pense que la meilleure façon est d'utiliser la base de données.
- Il ne souffle pas l'application et de la mémoire.
- La base de données correspondante est supprimée une fois que l'application est désinstallée.
- Personne ne peut atteindre à ces fichiers en dehors de votre application.
Mise à jour: Mais; Si vous souhaitez mettre en cache uniquement les données, il est un gestionnaire de cache défini dans WebKit. CacheManager
Je n'ai pas utilisé le paquet avant, mais les méthodes semblent avant d'utiliser directement:
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()
et vous pouvez trouver l'utilisation à code Google Gears
J'espère que cette aide.
Si vous vous ne voulez pas utiliser le CacheManager puis utiliser une base de données ou un fichier local (non-SD) (fichiers locaux sont supprimés sur une désinstallation complète) et vous inscrire pour recevoir le « ACTION_DEVICE_STORAGE_LOW » et diffusion « ACTION_DEVICE_STORAGE_OK » Actions. Ensuite, vous saurez quand votre application prend trop de place selon l'appareil et lorsque vous avez besoin pour commencer la suppression des images. Votre taille de l'application va encore croître, mais vous serez en mesure de gérer la croissance et le retrait.
Juste un petit conseil - si vous les enregistrez sur la carte SD, ils seront analysés par le MediaScanner et apparaîtront dans la Galerie des utilisateurs (photos), que vous ne voulez probablement pas. Donc, vous voulez probablement les stocker sur le téléphone, ou en quelque sorte dire MediaScanner de ne pas les analyser (apparemment impossible après une recherche rapide sur Google.)
Probablement le meilleur pour stocker quelques privilégiés dans le répertoire privé de votre application, qui sera supprimé lorsque votre application est désinstallée.