【问题标题】:Assets not replaced by version upgrade?资产不被版本升级取代?
【发布时间】:2015-11-02 01:25:11
【问题描述】:

我编写了一个更新版本的应用程序,该应用程序可以处理存储在 assets 资源文件夹中的目录中的文本文件。如果该应用程序安装在没有以前版本的设备上,则该应用程序可以正常工作。但是,如果我在安装了以前版本的设备上安装更新版本,则资源文件似乎没有更新。使用 Android Studio 安装和使用 google play 商店更新应用程序时都会发生这种情况。我已经尝试使用以下方法在启动时明确获得对资产的访问权限:

    final Context context = getApplicationContext();
    context.getAssets();

但它没有帮助。

感谢您的建议。

【问题讨论】:

  • 资产文件夹里面有什么? .html 文件?你的应用程序是 webapps 吗?
  • @Randyka。感谢回复。不,它们是以文本形式存储的数字数据集。

标签: android resources assets


【解决方案1】:

android 应用程序的AFAIK Assets 文件夹只会在安装时初始化一次。打包并安装应用程序后,您无法更新资产文件夹。安装后,如果您对资源进行任何更改,它不会反映到您安装的旧版本。由于 Asset 文件夹是只读的,您无法写入或更新那里存在的任何文件。

如果要更新它,则需要卸载旧版本并安装新版本:Source。 或者你可以把你的文本放在资源原始文件夹中。 像这样的东西(txt文件的名称是'help'):

try {
        Resources res = getResources();
        InputStream in_s = res.openRawResource(R.raw.help);

        byte[] b = new byte[in_s.available()];
        in_s.read(b);
        txtHelp.setText(new String(b));
    } catch (Exception e) {
        // e.printStackTrace();
        txtHelp.setText("Error: can't show help.");
    }

是的,基本上你只需使用以下命令删除现有资产文件夹:

public void clearApplicationData() {
        File cache = getCacheDir();
        File appDir = new File(cache.getParent());
        if (appDir.exists()) {
            String[] children = appDir.list();
            for (String s : children) {
                if (!s.equals("lib")) {
                    deleteDir(new File(appDir, s));
                    Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
                }
            }
        }
    }

    public static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }

        return dir.delete();
    }

【讨论】:

  • Randyka,您的回答意味着放置在 assets 文件夹中的项目在应用程序的生命周期内永远无法更改。这个对吗?这似乎是一个不合理的限制。
  • 我不知道这是否有帮助,但如果我“清除数据”,那么新版本就会开始工作。有没有办法在新应用版本开始时“清除数据”?
  • @EricS 编辑了我的答案。但我建议将您的文本文件保存在您的资源中,因为删除您的资产文件夹意味着删除您保存的首选项,更糟糕的是您的应用程序数据库
  • 不幸的是,我有一个可扩展列表视图,它使用资产的目录结构来提供组和子数据。我了解 resources/raw 不允许这样的事情。
  • 我希望有一个更好的解决方案,因为看起来为了使更改生效,我还需要使用调用 System.exit(0); 来强制关闭应用程序;但是,这是一个有用的解决方案,所以我会接受它。感谢您的帮助!
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2022-11-12
  • 2011-02-19
  • 2017-04-12
  • 2021-08-18
相关资源
最近更新 更多