首页 > 代码库 > 应用商城 下载apk 安装包解析错误 没有权限 Permission denied Android - failed to open zip archive

应用商城 下载apk 安装包解析错误 没有权限 Permission denied Android - failed to open zip archive

1.错误提示:

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

2.错误提示显示:没有权限打开 压缩文件 
Unable to open zip '/data/data/com.my.app/cache/myApp.apk': Permission denied 。
3.知识要点:

    (1)做应用商城开发时 我们下载apk遇到一种情况就是 下载的apk 保存在哪里?两种情况: 一是保存在 sd卡,一是保存在机器本身的内存中。为了保证我们开发的应用商店能用,下载的apk最好保存在内存中,有可能有些机器没有sd卡(这不起怪,有些android电视机就不标配sd卡)。
     (2) 应用商城多线程下载apk 的时候没有问题,下载下来的apk数据包是完整的,用 U盘拷贝出来也可以安装。但是在静默安装时候提示Permission Denied ,但是我在安装此apk之前 修改了apk的权限:

String[] command = { "chmod", "-R", "777", apkFile.getPath() };
			ProcessBuilder builder = new ProcessBuilder(command);
			try {
				builder.start();
				if (Debug.isDebug) {
					Log.d("Download", "process builder start success");
				}
				break;
			} catch (IOException e) {
				connt = connt + 1;
				if (connt >= 10) {
					break;
				} else {
					Log.e("Download", "process builder start exception");
				}
			}

问题就出现在这里,权限虽然改了,但是修改权限的函数 
  <pre name="code" class="java">ProcessBuilder builder = new ProcessBuilder(command);
    builder.start();

是开启一个新的进程。此时就会出现线程异步操作问题,即:修改权限的进程和安装apk 的进程是一个异步线程操作,可能在安装apk 之前 对应的apk 权限还没有修改完成,所以出现了   提示Permission Denied 错误。


4.解决办法:

    在修改apk 的权限之后让主线程睡眠500ms 到1000ms 即可。

try {
			Thread.sleep(500);
		} catch (Exception e) {
			e.printStackTrace();
		}

                                                                                                                                     完结!