Где сохранить фотографии на Android?

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

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

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

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

  • Использует пространство, которое не будет освобождено при удалении
  • Секретно использует пространство на SD-карте.

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

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

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

Ответ 1

Лучшее решение для использования:

context.getCacheDir()

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

Обратите внимание, что документы говорят:

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

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

getExternalCacheDir()

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

Environment.getExternalStorageState()

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

Ответ 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

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

Ответ 4

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

Ответ 5

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