首次启动时将文件放入新创建的外部存储文件夹中

Put files in newly created external storage folder on first launch

我的 Android 应用在启动时在用户设备的外部存储上创建了一个文件夹:

File images = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + "rapical" + File.separator);
images.mkdirs();

我有大约 16 个图像图标 (.png),我想在用户第一次打开应用程序时将它们放在这个文件夹中。

执行此操作的最佳做​​法是什么?我应该先将它们放在可绘制文件夹中,然后将它们复制到新创建的图像文件夹中吗?不确定要采取什么方法!

这里有两个不同的问题:

  1. 如何处理用户添加到您的应用中的图片?

  2. 如何处理您的默认食物初始图片?


对用户添加的图像使用 external storage 有一些影响:

  • 您的应用程序可以在该图像不再存在后继续存在,因为用户或其他应用程序可以随时删除该文件

  • 您的用户不介意图像会被其他应用程序(例如照片库)获取

除非您特别希望这些图像在您的应用程序之外可供用户操作,否则我建议您对 "re-sized, compressed and stored" 用户使用 internal storage-提供的图像。原始图像可能在外部存储上(我假设您正在使用 ACTION_GET_CONTENT and/or ACTION_OPEN_DOCUMENT 来获取图像),但您修改后的副本对您的应用程序来说是私有的。


我真诚地希望您使用 image-loading library, like Picasso 来加载这些图像,因为它们会为您处理诸如后台线程和 ListView/RecyclerView 图像回收之类的事情.

在那种情况下,您在 SQLite 数据库中为默认食物存储的内容需要是图像加载库可以解释的内容,以引入您想要的图像。

在这种情况下,我建议使用 assets/ 来传送图像和数据库中的 file:///android_asset/... 值。 file:///android_asset/ 指向项目中的 assets/,因此如果项目中有 assets/chicken_pad_thai.jpg,毕加索(以及任何体面的图像加载库)将能够解释 file:///android_asset/chicken_pad_thai.jpg) 并加载图像。

这样可以避免复制图像、节省用户磁盘 space 和首次启动时间。这也意味着,如果您更换应用程序中的图像(例如,您得到一张代表泰式鸡垫的更好照片),用户将开始看到更新后的图像,而无需您做一些额外的工作来意识到您发送了一个新的图像并且必须将该图像复制到某个文件中。


现在,假设您确实确实希望将用户提供的图像保存在外部存储器中。在那种情况下:

  • 可能不是您选择的目录,我会选择 getExternalFilesDir()Context 上的方法),如 API 级别 19+,您不需要 WRITE_EXTERNAL_STORAGE 作为权限

  • 如果您希望用户能够操作默认食物的图像,请先将这些图像复制到该位置 运行