Onde guardar imagens no Android?
Pergunta
Meu aplicativo usa um monte de imagens que são baixados da internet e armazenados em cache localmente no telefone Android. Eu estou querendo saber, qual é a maneira correta de guardar essas fotos. Existem várias maneiras que eu vejo, que não estão satisfazendo plenamente.
salvá-los no cartão SD em uma pasta pública
- consome espaço que costuma ser libertados na desinstalação
- O usuário pode ver as fotos na Galeria
- Precisa de uma pasta na raiz sdcard (você pode realmente vê-lo enquanto navega seu telefone)
salvá-los no cartão SD em uma pasta não-pública
- consome espaço que costuma ser libertados na desinstalação
- secretamente usa o espaço no cartão SD
Save-los dentro do aplicativo
- explode tamanho da aplicação demasiado
O que é a maneira correta de salvar localmente as imagens do meu aplicativo para não distrair o usuário e não deixam qualquer lugar lixo?
Solução
Sua melhor solução é usar:
context.getCacheDir()
Este diretório é privado para a aplicação e será eliminado na desinstalação, além disso o sistema pode excluir este diretório para você se o dispositivo está com falta de espaço.
Note que embora os médicos dizem:
Você não deve contar com o sistema excluir esses arquivos para você; vocês deve sempre ter um razoável máximo, tal como de 1 MB, para a quantidade de espaço que você consumir com arquivos de cache, e podar esses arquivos quando superior que o espaço
Se você precisar de um monte de espaço e prefere usar o cartão SD você pode chamar
getExternalCacheDir()
em seu lugar. Estes também são removidos na desinstalação, mas o sistema não monitora o espaço disponível no armazenamento externo, por isso não vai apagar automaticamente esses arquivos se com pouco espaço. Se usar esta opção, você também deve verificar se o armazenamento externo está disponível com
Environment.getExternalStorageState()
Antes de tentar escrever a ele.
Outras dicas
Você pode ocultar imagens do MediaScanner se você colocá-lo em um escondido dir (isto é, com um ponto pré-fixada) tal como /sdcard/.donotscan/
.
Update: Como romainguy menciona no twitter isso também funciona se você colocar um arquivo chamado .nomedia
para a dir.
Eu acho que a melhor maneira é usar o banco de dados.
- Não explodir a aplicação e memória.
- O banco de dados relacionado é excluído uma vez que o aplicativo é desinstalado.
- Ninguém pode chegar a este arquivos, além de sua aplicação.
Update: Mas; Se você deseja armazenar em cache apenas os dados, há um gerenciador de cache definido no webkit. CacheManager
Eu não usar o pacote antes, mas os métodos parecem simples 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()
e você pode encontrar o uso de código Google Gears
Espero que isso ajude.
Se você não quiser usar o CacheManager seguida, usar um arquivo local (não-SD) do banco de dados ou (arquivos locais são apagados em uma desinstalação completa) e se cadastrar para receber o 'ACTION_DEVICE_STORAGE_LOW' e transmissão 'ACTION_DEVICE_STORAGE_OK' ações. Então você saberá quando seu aplicativo está ocupando muito espaço de acordo com o dispositivo e quando você precisa para começar a apagar imagens. Seu tamanho aplicativo ainda vai crescer, mas você será capaz de gerenciar o crescimento e encolhimento.
Apenas uma dica - se você salvá-los no cartão SD, eles serão digitalizados pela MediaScanner e aparecerá na galeria do usuários (Fotos), que você provavelmente não quer. Então você provavelmente vai querer armazená-los no telefone, ou de alguma forma dizer MediaScanner não digitalizá-los (aparentemente impossível após uma rápida pesquisa no Google.)
Provavelmente melhor para armazenar um grupo seleto no diretório privado da sua aplicação, que será removido quando o aplicativo é desinstalado.