33

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

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

  • 使用卸载时不会释放的空间
  • 用户可以在图库中查看图片
  • 需要 sdcard 根目录上的文件夹(您实际上可以在浏览手机时看到它)

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

  • 使用卸载时不会释放的空间
  • 偷偷使用 SD 卡上的空间

将它们保存在应用程序中

  • 过度扩大应用程序大小

在本地保存我的应用程序图像的正确方法是什么,不会分散用户的注意力,也不会在任何地方留下垃圾?

4

5 回答 5

31

您最好的解决方案是使用:

context.getCacheDir()

该目录是应用程序私有的,将在卸载时删除,此外,如果设备空间不足,系统可以从该目录中删除。

请注意,文档说:

您不应依赖系统为您删除这些文件;对于缓存文件消耗的空间量,您应该始终有一个合理的最大值,例如 1 MB,并在超过该空间时修剪这些文件

如果您需要大量空间并且宁愿使用 SD 卡,您可以致电

getExternalCacheDir()

反而。这些文件也会在卸载时被删除,但系统不会监控外部存储中的可用空间,因此如果空间不足,不会自动删除这些文件。如果使用此选项,您还应该检查外部存储是否可用

Environment.getExternalStorageState()

在尝试写入之前。

于 2011-05-09T12:47:53.850 回答
11

如果将 MediaScanner 中的图像放在隐藏目录中(即,以点为前缀),例如/sdcard/.donotscan/.

更新:正如romainguy 在 twitter 上提到的,如果您将一个名为的文件.nomedia放入目录中,这也可以工作。

于 2010-02-25T12:49:15.557 回答
6

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

  1. 它不会炸毁应用程序和内存。
  2. 卸载应用程序后,相关数据库将被删除。
  3. 除了您的应用程序之外,没有人可以访问此文件。

更新:但是;如果你只想缓存数据,webkit 中定义了一个缓存管理器。缓存管理器

我以前没有使用过这个包,但这些方法似乎很容易使用:

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 代码中找到用法

我希望这有帮助。

于 2009-05-12T08:30:06.797 回答
0

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

于 2009-05-17T02:17:45.703 回答
-1

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

于 2009-05-17T02:28:11.060 回答