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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Где сохранить фотографии на Android?"

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

context.getCacheDir() 

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

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

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

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

 getExternalCacheDir() 

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

 Environment.getExternalStorageState() 

Прежде чем пытаться написать ему.

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

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

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

  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

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

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

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