解析程序包出现问题(更新下载apk)

最近在做更新功能

由于公司的项目是没有上线的,所以不能借助APP商店来更新。


我的大致思路是:

1.校验APP的版本号

2.下载最新版本

3.安装apk包

解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)


1.校验APP的版本号

由于公司后台比较忙,没时间帮我写这个接口。我自己写了一个json文件丢到Tomcat的root文件夹下面(必须是root下面,不能包裹一层文件夹。应该是要改Tomcat的一些配置才行,具体没有研究)。

这样我就有接口可以用了(将就着用)。同理,apk包也丢到root文件下。

解析程序包出现问题(更新下载apk)

解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)闪屏界面中发出校验请求,在返回的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无法安装(左图)。博主通过模拟器的文件管理找到了文件,一看这个文件只有读写权限。于是百度一番,找到了解决方案

跳转到安装界面属于别的应用程序,是没有权限对只有读写权限的安装包进行解析的。

解析程序包出现问题(更新下载apk)

解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)解析程序包出现问题(更新下载apk)

               解析程序包出现问题(更新下载apk)           解析程序包出现问题(更新下载apk)


通过在代码中写入Linux指令,修改此apk文件的权限。改为全局可读可写可执行。

String[] command = {"chmod", "777", file.getPath() };
ProcessBuilder builder = new ProcessBuilder(command);
try {
    builder.start();
} catch (IOException e) {
    e.printStackTrace();
}


之后在进行调试就没问题了。通过文件管理系统,可以观察到下图中的情况(权限都补齐了)。

解析程序包出现问题(更新下载apk)