Android - 打开zip文件失败

8
我正在从网络下载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上不可能实现。 编辑2:我一定看错了 - 我下载的apk存在于缓存中... 仍然没有允许从该目录安装的权限?

你尝试过使用openFileOutput()函数吗?如果没有,请尝试使用MODE_WORLD_READABLE参数。 - Panthro
你好,你找到上述问题的解决方案了吗?我现在也遇到了类似的困境。 - CodeGuru
我已经在评论中几乎看到每个答案都建议使用WORLD_WRITABLE。除了测试权限是否存在问题之外,请勿这样做。 - domen
3个回答

6
在将下载的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();
}

谢谢。运行该命令后,软件包安装程序可以打开已下载的文件。 - Blehi
我会使用chmod 644,因为这是/system应用程序的权限设置。不确定为什么您想要一个允许其他程序写入权限的chmod 666。您也可以通过adb安装它并执行此操作,然后重新启动。 - Stephan GM

3
这可能会对您有所帮助:
FileOutputStream fOutputStream = context.openFileOutput(
    fileName, Context.MODE_WORLD_READABLE);

1

我知道发生了什么...

缓存目录是由Android管理的缓存,这意味着当内部存储器开始运行低时,它可以被清理。

如果您的应用程序在缓存上占用了太多空间(可能是APK),当您的应用程序被暂停/停止时,Android可能会清除您的缓存目录。

要测试是否为此情况,请按照您所做的一切操作,并在安装过程开始时打开DDMS,看看您的文件是否仍在缓存中。

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

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


嗨,我实际上正在使用Context.getCacheDir(),但我无法在ADB缓存中看到已下载的应用程序...似乎系统在更新后立即将其删除... - Waypoint
对于context.getFilesDir()和getCacheDir()来说,都没有成功。 - Waypoint
那就是问题所在...你知道apk的大小吗?看起来它太大了,无法存储在内部存储器中...你需要将其存储在SD卡中...安装...然后删除。 - Panthro
apk文件大小为200 kB,缓存一定要更大。我正在按照你说的做,现在就开始了。我只是想,一定有更好的解决方案。 - Waypoint
你是否尝试使用openFileOutput()函数?如果没有,请尝试使用MODE_WORLD_READABLE模式。更多信息请参考http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String, int)。 - Panthro
目前无法确定,我必须显着重新设计我的下载意图,因为openFileOutput()用于存储文件,而我使用BufferedInputStream和FileOutputStream来存储它们。 - Waypoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,