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?

Foi útil?

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.

  1. Não explodir a aplicação e memória.
  2. O banco de dados relacionado é excluído uma vez que o aplicativo é desinstalado.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top