网站内容自动更新(蒲公英提供的版本查询接口和版本下载接口来做的)
优采云 发布时间: 2021-12-29 01:04网站内容自动更新(蒲公英提供的版本查询接口和版本下载接口来做的)
介绍
目的不言而喻,绝对是为了自己版本的迭代更新。还有更多的方法可以实现对版本的完全控制。今天要分享的方法是使用蒲公英提供的版本查询界面和版本下载界面。有条件的同学也可以在自己的服务器上打开这两个界面。
需求分析
如果我们要实现这个自动更新功能,大致分为三步:
查询在线版本号,并与本地版本号进行比较。如果在线版本号大于本地版本号,下载在线版本号,安装下载的版本号,替换当前旧版本权限
根据上面的要求,我们可以知道需要使用的权限应该有网络权限、本地文件写入权限、本地文件读取权限。使用网络权限获取在线版本号,然后下载并保存到本地,安装时再本地获取。
步
根据以上要求,我们将逐步实现该功能。首先在APP入口处查看版本号。
ProUtils.canUpdata(this);
这里我把检测方法封装成utils,方便使用。
1.查看网络版本
public void check() {
//当所用app前版本号
int codeversin = getVersion();
getLineVersion(checkurl, codeversin);
}
该方法收录
两个步骤。第一步获取本地版本号,第二步获取在线版本号。
获取本地版本号:
public int getVersion() {
PackageInfo pkg;
int versionCode = 0;
String versionName = "";
try {
pkg = activity.getPackageManager().getPackageInfo(activity.getApplication().getPackageName(), 0);
versionCode = pkg.versionCode;
} catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return versionCode;
}
获取在线版本号:
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("_api_key", BuildConfig.PYAPIKEY)
.add("a*敏*感*词*ey", BuildConfig.PYAPPID)
.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
顶部有两个KEY,都可以从蒲公英中取出。就像介绍一样,有条件的可以自己搭建。
版本对比
上述请求成功后,在响应中会得到我们的在线版本号。然后我们将上一步得到的在线版本号与本地版本号进行对比:
if (lineVersion > nowcodeversin) {
//去弹窗提示用户
}
这时候如果对比的结果是网络版比较大,就下载网络版
提示用户
我们想给用户一个提示,当然,如果你想直接下载,只是为了用户体验,你可以自己决定。
提醒用户
AlertDialog dialog = new AlertDialog.Builder(activity).setTitle
("Tips").setMessage("Have new version,please update!")
.setNeutralButton("Cancel", new DialogInterface
.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).setNegativeButton("Update", new DialogInterface
.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
pyUtils.downUrl();
}
}).show();
dialog.setCanceledOnTouchOutside(false);//可选
dialog.setCancelable(false);//可选
这里我给用户两个选择,一个是马上更新,一个是以后再说。单击“稍后”,它会在您下次出发时提醒用户。如果单击更新,将立即开始下载新版本的应用程序。
如果要强制用户更新,可以稍后删除该选项,顺便说一下
dialog.setCanceledOnTouchOutside(false);//可选,点击对话框其他地方禁用关闭
dialog.setCancelable(false);//可选,点击返回按钮无效
添加这两个项目,用户必须更新。
下载
以上都搞定了,那就下载吧,这是一种文件下载方式:
public void downUrl() {
DownloadUtil.get().download(downUrl,activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), new DownloadUtil.OnDownloadListener() {
@Override
public void onDownloadSuccess(File file) {
LogUtils.e("AutoUpdate","下载完成去安装");
}
@Override
public void onDownloading(int progress) {
}
@Override
public void onDownloadFailed() {
LogUtils.e("AutoUpdate","下载失败");
}
});
}
这个下载没什么好说的
安装
下载后我们可以直接使用系统方法安装
调用系统的安装方法
private void installAPK(File savedFile) {
//调用系统的安装方法
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data;
// 判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// "net.csdn.blog.ruancoder.fileprovider"即是在清单文件中配置的authorities
data = FileProvider.getUriForFile(activity, "com.thinker.member.bull.android_bull_member.fileprovider", savedFile);
// 给目标应用一个临时授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
LogUtils.e("AutoUpdate","7.0data="+data);
} else {
data = Uri.fromFile(savedFile);
LogUtils.e("AutoUpdate","111data="+data);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
activity.startActivity(intent);
activity.finish();
}
这里需要注意的是,有一个7.0 方法。需要在你的项目manifest文件中进行如下配置
然后在资源res中添加xml/file_paths.xml
基本上应该没问题。读一百本书不如手写。自己试试吧。