【问题标题】:Where to save pictures on Android?Android上的图片保存在哪里?
【发布时间】:2010-10-25 06:18:14
【问题描述】:

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

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

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

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

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

将它们保存在应用程序中

  • 使应用程序的大小太大

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

【问题讨论】:

    标签: java android media image


    【解决方案1】:

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

    context.getCacheDir()
    

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

    请注意,尽管文档说:

    你不应该依赖系统 为您删除这些文件;你 应该总是有一个合理的 金额的最大值,例如 1 MB 缓存文件占用的空间, 并在超过时修剪这些文件 那个空间

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

    getExternalCacheDir()
    

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

    Environment.getExternalStorageState()
    

    在尝试写入之前。

    【讨论】:

    • 很久以来一直在寻找这样一个想法的好答案。
    【解决方案2】:

    如果您使用put it in a hidden dir(即前缀为点),例如/sdcard/.donotscan/,则可以从 MediaScanner 隐藏图像。

    更新:作为romainguy mentions on twitter,如果您将名为.nomedia 的文件放入目录中,这也有效。

    【讨论】:

      【解决方案3】:

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

      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 code找到用法

      我希望这会有所帮助。

      【讨论】:

      • 我正在使用数据库来存储一些其他数据,它确实增加了应用程序的大小。您可以在设置/应用程序/管理应用程序中看到它。
      • 最适合您的方法是使用 CacheManager 缓存文件。我更新了我的答案。请看我的更新。
      • 我不同意 CacheManager 是最好的解决方案,它的使用已被弃用。引用文档:“此类已弃用。对 HTTP 缓存的访问将在未来版本中删除。”
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-30
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-20
          相关资源
          最近更新 更多