【问题标题】:Copying an entire folder from R.raw to SD将整个文件夹从 R.raw 复制到 SD
【发布时间】:2014-10-09 12:04:14
【问题描述】:

我有一个完整的文件夹,我想将它放在 R.raw 文件夹中,使其看起来像这样:

raw/thor/myfirstfile.jpg   
raw/thor/mysecondfile.m4a
raw/thor/mythirdfile.json
raw/batman/myfirstfile.jpg
raw/batman/mysecondfile.m4a
raw/batman/mythirdfile.json

这样我就可以将文件夹复制到:

/externalSD/.../themes/thor/myfirstfile.jpg
/externalSD/.../themes/thor/mysecondfile.m4a
/externalSD/.../themes/thor/mythirdfile.json
/externalSD/.../themes/batman/myfirstfile.jpg
/externalSD/.../themes/batman/mysecondfile.m4a
/externalSD/.../themes/batman/mythirdfile.json

我无法将文件夹放入 R.assets,因为包含这些资产的项目是一个库,我需要从应用程序项目中访问文件。

将所有文件简单地放入 raw/assets/drawable/etc 目录也不是一个选项,因为主题本质上是用于搜索 SD 卡上的目录的模板,其想法是可以下载更多主题。

目前我的解决方案是将文件夹打包成 zip 文件,如下所示:

raw/thor.zip
raw/batman.zip

使用以下方式访问它们:

InputStream fileStream = context.getResources().openRawResource(rawResource);

然后在应用程序第一次运行时将其解压缩到 SD 卡上 - 但速度非常慢。 (希望)简单地复制一个文件夹而不是解压缩一个文件夹会更快。

我的问题是如何从 R.raw 资源中复制整个文件夹?

【问题讨论】:

  • Tou 不能在 raw 中创建子文件夹。好吧,您可以在 ide 中创建它们,但是您的应用程序无法访问其中的所有文件。如果您想要子文件夹,请使用资产目录。

标签: android android-resources android-assets


【解决方案1】:

我有一个完整的文件夹,我想将它放在 R.raw 文件夹中,使其看起来像这样

不支持。 res/raw/ 中不能有子目录。 assets/ 可以替代res/raw/

我无法将文件夹放入 R.assets,因为包含这些资产的项目是一个库,我需要从应用程序项目中访问文件。

Android 库项目现在支持资产,至少在 Android Studio/Gradle for Android 上是这样。我最近没有在 Eclipse 上尝试过它们。

我的问题是如何从 R.raw 资源中复制整个文件夹?

由于您无法将整个文件夹放入res/raw/,因此您无法将其复制出来。

只要您遵守 Java 数据成员命名规则,欢迎您发明自己的名称修改算法(例如,raw/theme___thor___myfirstfile.jpg)。然后,您可以在写出这些文件名时将它们转换为相对路径。您需要使用反射遍历 R.raw 的静态数据成员,以找出名称及其对应的资源 ID 值。

但是,我建议您先尝试资产,因为它可能比您预期的效果更好。或者,如果此库纯粹供您自己使用(即,不用于公共分发),则可能切换到 Android Studio 并使用产品风格而不是应用程序和单独的库。

【讨论】:

  • 有一些有用的信息和链接here 但你是对的。是时候迁移到 Android Studio 和 Gradle,Flavor 听起来完全符合我的需求。
  • 顺便说一句,我设法链接资产文件夹并复制资产而不是解压缩 - 结果从 apk 中复制似乎是瓶颈 - 不是解压缩。因此,即使将文件解压缩到链接资产文件夹中,将它们复制到 SD 卡或本地文件系统仍然需要很长时间。
  • @shredder:这并不令人震惊。闪存上的磁盘写入通常很慢,许多 Android 设备都有……质量可疑的闪存。 :-) 但是请注意,这是您真正想要在硬件上测量的一个区域,因为仿真器在磁盘 I/O 上往往比生产设备更快,因为您的开发计算机的硬盘驱动器或 SSD 通常很多比闪存快。
  • 公平点,我倾向于尽可能使用 Genymotion 进行开发——而且速度非常快。所以你是对的,你需要使用真实的设备。此外,apk 本身是一个 zip 文件,因此从 apk 中取出文件可能是一个解压缩过程。感谢您的帮助@CommonsWare。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2011-06-22
  • 2012-06-20
相关资源
最近更新 更多