在Android上保存图片的位置?

Ulr*_*ler 33 java media android image

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

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

  • 使用卸载时不会释放的空间
  • 用户可以在Gallery中看到图片
  • 在SD卡根目录上需要一个文件夹(您可以在浏览手机时看到它)

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

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

将它们保存在应用程序中

  • 太大的应用程序大小

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

Rup*_*tes 31

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

context.getCacheDir()
Run Code Online (Sandbox Code Playgroud)

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

请注意,虽然文档说:

你不应该依赖系统为你删除这些文件; 对于使用缓存文件占用的空间量,应始终具有合理的最大值(例如1 MB),并在超过该空间时修剪这些文件

如果您需要大量空间而宁愿使用SD卡,也可以拨打电话

getExternalCacheDir()
Run Code Online (Sandbox Code Playgroud)

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

Environment.getExternalStorageState()
Run Code Online (Sandbox Code Playgroud)

在尝试写入之前.


rnd*_*str 11

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

更新:正如romainguy在twitter上提到的那样,如果你把一个文件命名.nomedia为dir,这也有效.


Öme*_*mer 6

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

  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()
Run Code Online (Sandbox Code Playgroud)

您可以在Google Gears代码中找到该用法

我希望这有帮助.

  • 我不同意CacheManager是最好的解决方案,不推荐使用它.引用文档:"此类已弃用.将来的版本中将删除对HTTP缓存的访问权限." (3认同)