一般上线项目都需要做自动更新这个模块,写下来已作为以后的参考
1.我用的OKHttp上代码:
//初始化网络协议
HTTPCaller.getInstance().post(CheckUpdate.class, url, null, null, requestDataCallback);
/**
* HTTPCaller回调方法
* CheckUpdate 是json解析的实体类 这个根据服务端返回的数据类型建立
*/
private RequestDataCallback<CheckUpdate> requestDataCallback = new RequestDataCallback<CheckUpdate>() {
@Override
public void dataCallback(CheckUpdate obj) {
if (obj != null) {
if (obj.data.has_new_ver) {
//这里我自己写的服务端 给我一个是否更新的标记(当然也可以根据版本号进行判断)
showDialog(obj.data.version_info.download_url);
} else {//没有新版本
Gson gson = new Gson();
gson.toJson(obj);
Toast.makeText(context, "这是最新版本", Toast.LENGTH_SHORT).show();
}
}
}
};
/**
* 显示更新对话框
*
* @param downloadUrl 下载的网址
* 下载apk的地址是服务端返回的
*/
private void showDialog(final String downloadUrl) {
// 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象
AlertDialog.Builder builder = new AlertDialog.Builder(context);
// 设置提示框的标题
builder.setTitle("版本升级").
setIcon(R.mipmap....). // 设置提示框的图标
setMessage("发现新版本!请及时更新").
setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//下载最新的版本程序
startUpload(downloadUrl);
}
});
AlertDialog alertDialog = builder.create();
// 显示对话框
alertDialog.show();
}
/**
* 开始下载
*
* @param downloadUrl 下载url
*/
private void startUpload(String downloadUrl) {
// progressDialog = new ProgressDialog(context);
// progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// progressDialog.setMessage("正在下载新版本");
// progressDialog.setCancelable(false);//不能手动取消下载进度对话框
final String fileSavePath = HttpUtils.getSaveFilePath(downloadUrl);//设置自己的下载地址
Logs.doLog("----fileSavePath-------------" + fileSavePath);
HTTPCaller.getInstance().downloadFile(downloadUrl, fileSavePath, null, new ProgressUIListener() {
@Override
public void onUIProgressStart(long totalBytes) {//下载开始
// progressDialog.show();
Toast.makeText(context, "正在更新...", Toast.LENGTH_SHORT).show();
}
//更新进度
@Override
public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
// progressDialog.setProgress((int) numBytes);
}
@Override
public void onUIProgressFinish() {//下载完成
// progressDialog.dismiss();
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();
openAPK(fileSavePath);
}
});
}
/**
* 获取文件保存路径 sdcard根目录/download/文件名
*设置自己的下载地址 我是直接写死的
* @param fileUrl
* @return
*/
public static String getSaveFilePath(String fileUrl) {
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1, fileUrl.length());//获取文件名称
Logs.doLog("----文件名字-------------" + fileName);
String newFilePath = "/mnt/sdcard" + "/Download/" + fileName;
Logs.doLog("----fileSavePath-------------" + newFilePath);
return newFilePath;
}
/**
* 下载完成安装apk
*
* @param fileSavePath 下载路径
*/
private void openAPK(String fileSavePath) {
File file = new File(fileSavePath);
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
// "com.highsail.chatcenter.fileprovider"即是在清单文件中配置的authorities(这里我写的是自己的包名)
data = FileProvider.getUriForFile(context, "com.yunboai.xiaok", file);
// 给目标应用一个临时授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
data = Uri.fromFile(file);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//安装完成之后可以直接打开app,避免安装完成闪回桌面的问题
intent.setDataAndType(data, "application/vnd.android.package-archive");
context.startActivity(intent);
}
代码写的很详细,也是自己留着备用的