【问题标题】:Android - failed to open zip archiveAndroid - 无法打开 zip 存档
【发布时间】:2017-07-03 16:08:06
【问题描述】:

我正在从网上下载 apk 文件并将他存储到 Context.getCacheDir() 中。我正在通过 HttpURLConnection 下载文件 - 我实际上并没有询问代码(它完全正常工作),所以我没有在这里发布它。我成功启动下载。文件被下载到缓存中,然后提示安装-但系统无法打开我的APK并写入分析错误。

因此问题如下:

03-31 16:48:43.740: INFO/ActivityManager(59): Start proc com.android.packageinstaller for activity com.android.packageinstaller/.PackageInstallerActivity: pid=620 uid=10026 gids={}
03-31 16:48:44.749: WARN/zipro(620): Unable to open zip '/data/data/com.my.app/cache/myApp.apk': Permission denied
03-31 16:48:44.749: DEBUG/asset(620): failed to open Zip archive '/data/data/com.my.app/cache/myApp.apk'
03-31 16:48:44.930: WARN/PackageParser(620): Unable to read AndroidManifest.xml of /data/data/com.my.app/cache/myApp.apk
03-31 16:48:44.930: WARN/PackageParser(620): java.io.FileNotFoundException: AndroidManifest.xml

问题是 - 我没有权限以编程方式访问 /cache。有什么办法可以解决吗?我不想使用外部存储作为下载目录(当我将文件下载到外部存储时安装过程有效),缓存很棒,因为一般用户无法从文件管理器访问该文件,这就是我想要的。感谢您的想法。

这个问题已经困扰我一个多月了...

编辑:仍然没有解决方案,我试图认为我找到了第一件事,这在 Android 上是不可能的

Edit2:我一定看起来很糟糕 - 我下载的 apk 存在于缓存中...仍然没有允许从该目录安装的权限?

【问题讨论】:

  • 您是否尝试过使用openFileOutput()....如果没有,请尝试使用MODE_WORLD_READABLE
  • 您好,您找到上述问题的解决方案了吗?我现在也处于类似的状态。
  • 我已经看到 WORLD_WRITABLE 在这条评论的几乎每个答案中都提出了建议。做 NOT 做那件事不是为了测试权限是问题。

标签: android


【解决方案1】:

在将下载的 apk 文件安装到代码中之前,对它进行 chmod 666

更多细节:

path = your_apk_file_path_in_cache_dir;
permission="666";

try {
    String command = "chmod " + permission + " " + path;
    Runtime runtime = Runtime.getRuntime();
    runtime.exec(command);
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

  • 谢谢.. 运行该命令后,包安装程序可以打开下载的文件。
  • 我会改用chmod 644,因为这是为/system 应用程序设置的权限。不知道为什么你想要一个chmod 666 允许其他程序写权限。您也可以安装它并通过adb 执行此操作,然后重新启动。
【解决方案2】:

这可能会对您有所帮助:

FileOutputStream fOutputStream = context.openFileOutput(
    fileName, Context.MODE_WORLD_READABLE);

【讨论】:

    【解决方案3】:

    我明白发生了什么..

    缓存目录是由Android管理的缓存,这意味着一旦内部内存开始不足就可以清理它。

    并且如果您的应用程序在您的应用程序暂停/停止时占用过多的缓存空间(APK 可能正在执行的操作),Android 可能会清理您的缓存目录。

    要对此进行测试,请照常执行所有操作,安装过程开始时只需打开 DDMS 并查看您的文件是否仍在缓存中。

    如果没有,那么 android 已经清理了应用程序的缓存,因为它不再运行了。

    尝试使用不同的方法,而不是 context.getCacheDir() 尝试 context.getFilesDir()

    【讨论】:

    • 嗨,我实际上正在使用 Context.getCacheDir(),但我在 ADB 的缓存中看不到下载的应用程序...看起来系统在更新后立即删除它...跨度>
    • context.getFilesDir() 和 getCacheDir() 一样——没有成功
    • 这就是问题所在……你知道apk的大小吗?似乎太大了,无法存储在内部存储中...您需要将其存储在 sdcard 中...安装...然后删除。
    • apk 有 200 kB,缓存肯定更大。我现在就按照你说的做。我只是想,一定有更好的解决方案。
    • 您是否尝试过使用 openFileOutput()....如果没有,请尝试使用 MODE_WORLD_READABLE developer.android.com/reference/android/content/…, int)
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多