Где сохранить картинки на Android? - PullRequest
33 голосов
/ 11 мая 2009

Мое приложение использует довольно много картинок, которые загружаются из Интернета и кэшируются локально на телефоне Android. Мне интересно, как правильно сохранить эти картинки. Я вижу несколько способов, которые не полностью удовлетворяют.

Сохранить их на SD-карте в общей папке

  • Использует пространство, которое не освобождается при удалении
  • Пользователь может видеть фотографии в Галерее
  • Требуется папка в корне SDCard (вы можете увидеть ее во время просмотра телефона)

Сохраните их на SD-карте в непубличной папке

  • Использует пространство, которое не освобождается при удалении
  • Тайно использует место на SD-карте

Сохраните их внутри приложения

  • Слишком большой размер приложения

Как правильно локально сохранять изображения моего приложения, чтобы не отвлекать пользователя и нигде не оставлять мусор?

Ответы [ 5 ]

31 голосов
/ 09 мая 2011

Ваше лучшее решение - использовать:

context.getCacheDir()

Этот каталог является закрытым для приложения и будет удален при удалении; кроме того, система может удалить вас из этого каталога, если на устройстве недостаточно места.

Обратите внимание, что в документах написано:

вы не должны полагаться на систему удалив эти файлы для вас; вы всегда должен быть разумным максимум, например 1 МБ, на сумму пространства, которое вы используете с файлами кэша, и обрезать эти файлы при превышении это пространство

Если вам нужно много места и вы предпочитаете использовать SD-карту, вы можете позвонить

getExternalCacheDir()

вместо этого. Они также будут удалены при удалении, но система не отслеживает пространство, доступное во внешнем хранилище, поэтому не будет автоматически удалять эти файлы, если на диске мало места. Если вы используете эту опцию, вам также следует убедиться, что внешнее хранилище доступно с

Environment.getExternalStorageState()

прежде чем пытаться писать в него.

11 голосов
/ 25 февраля 2010

Вы можете скрыть изображения из MediaScanner, если вы поместите его в скрытый каталог (т.е. с префиксом точки), например /sdcard/.donotscan/.

Обновление: как romainguy упоминает в твиттере , это также работает, если вы поместите файл с именем .nomedia в каталог.

6 голосов
/ 12 мая 2009

Я думаю, что лучше всего использовать базу данных.

  1. Не взрывает приложение и память.
  2. Соответствующая база данных удаляется после удаления приложения.
  3. Никто не может получить доступ к этим файлам, кроме вашего приложения.

Обновление: но; Если вы хотите кешировать только данные, в webkit определен менеджер кеша. CacheManager

Я не использовал пакет раньше, но методы кажутся простыми в использовании:

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()

, и вы можете найти использование в Код Google Gears

Надеюсь, это поможет.

0 голосов
/ 17 мая 2009

Просто подсказка - если вы сохраните их на SD-карте, они будут отсканированы MediaScanner и появятся в пользовательской галерее (фотографии), которая вам, вероятно, не нужна. Таким образом, вы, вероятно, хотите сохранить их на телефоне или как-то сказать MediaScanner не сканировать их (по-видимому, невозможно после быстрого поиска в Google.)
Вероятно, лучше всего хранить несколько избранных в личном каталоге вашего приложения, которое будет удалено при удалении вашего приложения.

0 голосов
/ 17 мая 2009

Если вы не хотите использовать CacheManager, используйте базу данных или локальный (не SD-файл) файл (локальные файлы удаляются при полной деинсталляции) и зарегистрируйтесь для получения трансляций 'ACTION_DEVICE_STORAGE_LOW' и 'ACTION_DEVICE_STORAGE_OK' действия. Тогда вы узнаете, когда ваше приложение занимает слишком много места в зависимости от устройства и когда вам нужно начать удалять изображения. Размер вашего приложения будет продолжать расти, но вы сможете управлять ростом и сокращением.

...