android - 将文件与 Android 应用程序 bundle 在一起,并允许稍后进行其他下载

标签 android android-assets

我有一个应用程序,其中包含一堆小图像(大约 200 张图像)(总大小约 10MB),可以在不同情况下显示在屏幕上。当用户按下某个按钮时,会显示这些图像之一(可以是其中任何一个)。将来的任何时候都可能添加更多图像,因此应用程序会检查服务器上的 xml 文档(如果距离上次检查已过去至少 24 小时,则此检查在主 Activity 的 onCreate() 中完成)。 xml 文档列出了所有图像,因此可以轻松检查文档是否已更改以及是否添加了新图像。如果添加了更多图像,应用程序将从服务器下载这些图像,并将它们与设备上已存在的图像一起存储。

我的第一个想法是将 10MB 的图像与应用程序 bundle 在一起,将它们放入 Assets 文件夹中,应用程序第一次启动时,图像将从 Assets 文件夹移动到内部存储。然后,如果将来要添加更多图像,它们也会被下载并保存在内部存储中,因此所有图像都很好地拼凑在一起,但是经过一些实验后,我发现这需要很多时间设备的时间(在运行 Android 4.1 的 HTC One S 上进行测试)只是列出 Assets 文件夹中的图像(超过一分钟),更不用说实际复制它们了。这是 Not Acceptable ,因为我不希望用户第一次体验应用程序的等待时间超过一分钟。

我正在使用 AssetManager 类的 list(String path) 方法来列出文件。

所以我想我的问题是:

您将如何实现这一点,以便用户在首次启动时不必等待很长时间,并且应用程序仍然能够动态下载更多图像?

最佳答案

我有一个类似的情况,我将所有文件压缩在一个 zip 中并将其存储在 res/raw 文件夹中。然后,在第一次启动时,我将所有文件提取到应用程序的内部存储中。

public static void unzipFiles(Context context, int file) {
    InputStream stream;

    context.getFilesDir().mkdirs();
    String path = context.getFilesDir().getAbsolutePath();

    try {
        stream = context.getResources().openRawResource(file);
        if (stream == null) {
            throw new RuntimeException("Cannot load " + file + " file from raw folder");
        }

        ZipInputStream zis = new ZipInputStream(stream);
        ZipEntry entry;

        while ((entry = zis.getNextEntry()) != null) {
            if (entry.isDirectory()) {
                File f = new File(path, entry.getName());
                if (!f.exists()) {
                    f.mkdirs();
                }
            } else {
                int size;
                byte[] buffer = new byte[2048];

                File f = new File(path, entry.getName());
                FileOutputStream fos = new FileOutputStream(f);
                BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);

                while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
                    bos.write(buffer, 0, size);
                }
                bos.flush();
                bos.close();
            }
        }

    } catch (IOException e) {
        throw new RuntimeException("Cannot unzip '" + file + "'", e);
    }

}

关于android - 将文件与 Android 应用程序 bundle 在一起,并允许稍后进行其他下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218697/

相关文章:

android - 致命异常主sql数据库

android - 如何在 Android TabLayout 中设置选项卡的高度?

android - DialogFragment 和强制显示键盘

java - android 上的语言支持

android - 圆形 ListView(半圆上的项目)

java - 通过数组中的字符串名称访问资源字符串

android - .如何将文件从项目 Assets 文件夹复制到android studio中的设备数据文件夹?

android - 在 Android Studio 中的构建之间缓存 Assets

android-studio - 将 'assets' 文件夹放在 Android Studio 中的什么位置?