解析程序包出现问题(更新下载apk)
最近在做更新功能
由于公司的项目是没有上线的,所以不能借助APP商店来更新。
我的大致思路是:
1.校验APP的版本号
2.下载最新版本
3.安装apk包
1.校验APP的版本号
由于公司后台比较忙,没时间帮我写这个接口。我自己写了一个json文件丢到Tomcat的root文件夹下面(必须是root下面,不能包裹一层文件夹。应该是要改Tomcat的一些配置才行,具体没有研究)。
这样我就有接口可以用了(将就着用)。同理,apk包也丢到root文件下。
在闪屏界面中发出校验请求,在返回的json中有一个versionName字段,将这个字段与本地的versionNaem进行对比(当然你也可以用versioncode校验)。如果返回的版本号大于本地的版本号则需要更新(下载最新版本),相同则不作处理。
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); String oldVersionName = packageInfo.versionName; String newVersionName = response.body().getData().getVersionName();
2.下载最新版本
返回的json中有一个apkUrl字段(apk包的下载地址),用这个字段向服务器发起请求。文件(apk包)会以输入流的形式返回给你。将它写入指定路径的指定文件中就完成了下载。
public File saveFile(Response response) throws IOException { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; try { is = response.body().byteStream(); final long total = response.body().contentLength(); long sum = 0; File dir = new File(destFileDir); if (!dir.exists()) { dir.mkdirs(); } File file = new File(dir, destFileName); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { sum += len; fos.write(buf, 0, len); final long finalSum = sum; } fos.flush(); return file; } finally { try { if (is != null) is.close(); } catch (IOException e) { } try { if (fos != null) fos.close(); } catch (IOException e) { } } }
3.安装apk包
你可以将文件(apk包),保存到SD卡中,也可以保存到包名路径下的文件中。博主这里是保存到包名路径下的。这里你会遇到一个问题。你会发现你下载的apk无法安装(左图)。博主通过模拟器的文件管理找到了文件,一看这个文件只有读写权限。于是百度一番,找到了解决方案。
跳转到安装界面属于别的应用程序,是没有权限对只有读写权限的安装包进行解析的。
通过在代码中写入Linux指令,修改此apk文件的权限。改为全局可读可写可执行。
String[] command = {"chmod", "777", file.getPath() }; ProcessBuilder builder = new ProcessBuilder(command); try { builder.start(); } catch (IOException e) { e.printStackTrace(); }
之后在进行调试就没问题了。通过文件管理系统,可以观察到下图中的情况(权限都补齐了)。