在Android上保存图片的位置?

我的应用程序使用相当多的图片,从互联网上下载并在本地caching在Android手机上。 我想知道,什么是保存这些图片的正确方法。 我有几种方法可以看到,这并不完全令人满意。

将它们保存在公用文件夹中的SD卡上

  • 使用不会被卸载的空间
  • 用户可以在图库中看到图片
  • 需要一个SD卡根目录(你可以看到它,而浏览你的手机)

将它们保存在非公用文件夹中的SD卡上

  • 使用不会被卸载的空间
  • 偷偷在SD卡上使用空间

将它们保存在应用程序中

  • 应用程序的大小太多了

什么是在本地保存我的应用程序的图像正确的方式,不分散用户和任何地方没有垃圾?

Solutions Collecting From Web of "在Android上保存图片的位置?"

你最好的解决scheme是使用:

context.getCacheDir() 

该目录对应用程序是私有的,在卸载时将被删除,而且如果设备运行不足,系统可以从这个目录中删除。

请注意,文档说:

你不应该依赖系统为你删除这些文件; 您应该总是有一个合理的最大值,例如1 MB,用于使用caching文件的空间量,并在超出该空间时修剪这些文件

如果你需要大量的空间,而且愿意使用SD卡,你可以打电话

 getExternalCacheDir() 

代替。 这些在卸载时也会被移除,但系统不会监视外部存储空间的可用空间,因此如果空间不足,将不会自动删除这些文件。 如果使用这个选项,你也应该检查外部存储器是否可用

 Environment.getExternalStorageState() 

在尝试写入之前。

如果将其放置在隐藏的目录 (即带有点前缀的目录)中,则可以从MediaScanner隐藏图像,例如/sdcard/.donotscan/

更新:正如romainguy在Twitter上提到的,如果你把一个名为.nomedia的文件放到目录中,这也是有效的。

我认为最好的方法是使用数据库。

  1. 它不会炸毁应用程序和内存。
  2. 一旦应用程序被卸载,相关数据库将被删除。
  3. 除了您的应用程序,没有人可以联系到这些文件。

更新:但; 如果您只想caching数据,那么在webkit中定义了一个cachingpipe理器。 的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代码中find这个用法

我希望这有帮助。

如果您不想使用CacheManager,则使用数据库或本地(非SD)文件(本地文件在完全卸载时被删除)并注册以接收“ACTION_DEVICE_STORAGE_LOW”和“ACTION_DEVICE_STORAGE_OK”广播操作。 然后你就会知道当你的应用程序占用了太多的空间时,根据设备,当你需要开始删除图片。 您的应用程序规模仍将增长,但您将能够pipe理增长和缩减。

只是一个提示 – 如果您将它们保存在SD卡上,它们将被MediaScanner扫描,并出现在用户的图库(照片)中,您可能不想要。 因此,您可能希望将其存储在电话中,或者以某种方式告诉MediaScanner不要扫描它们(Googlesearch后显然不可能)。
可能最好将select的几个存储在应用程序的私有目录中,这些目录在卸载应用程序时将被删除。