由于项目中要求实现版本升级,特写此代码,有因为这段代码基本都是通用,所以记录下来,以便下次直接拷贝...
public class ApkVersionUpdate {
/** apk文件下载状态:正在下载 */
private static final int DOWNLOADING = 1;
/** apk文件下载状态:已完成下载 */
private static final int DOWNLOADED = 2;
/** 客户端保存到sd卡的路径 */
private String savePath;
/** 下载文件对话框 */
private Dialog downloadDialog;
/** 下载进度条 */
private ProgressBar downloadProgressBar;
/** 下载文件时的进度值 */
private int progress;
/** 是否取消更新,默认为否 */
private boolean cancelUpdate = false;
private Context mContext;
private OkHttpHelper httpHelper = OkHttpHelper.getInstance();
private String downloadurl;
private String clientVersionCode;
private String desc;
private String apkName="sanxin";
public ApkVersionUpdate(Context context) {
mContext = context;
getPackageManage();
}
public void checkVersion(final boolean showProgressDialog) {
final Message msg = Message.obtain();
Map<String,Object> params = new HashMap<>();
params.put("ports","children");
httpHelper.post(HttpUrl.version_url_http, params, new SimpleCallback<Version>(mContext) {
@Override
public void onSuccess(Response response, Version item) {
if(item.getResult()==0){
List<Version.VersionItem> list = item.getList();
Version.VersionItem versionItem = list.get(0);
String serverVersionCode = versionItem.getVersion();
downloadurl =versionItem.getDownloadurl();
desc = versionItem.getDesc();
Log.e("版本",clientVersionCode+"--"+serverVersionCode);
// 当最新版本号大于当前版本号时,提示更新
if (!serverVersionCode.equals(clientVersionCode)) {
if(Integer.valueOf(versionItem.getUpdatevs())==0){
showNoticeDialog();
}else {
showNoticeDialog2();//强制更新
}
} else {
if (showProgressDialog) {
Toast.makeText(mContext, "您现在使用的是最新版本哦", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onError(Response response, int code, Exception e) {
}
});
}
private void showNoticeDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("更新提醒");
builder.setMessage(desc);
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
builder.setNegativeButton("下次再说", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setPositiveButton("立刻更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showDownloadDialog();
}
});
builder.show();
}
private void showNoticeDialog2() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("更新提醒");
builder.setMessage(desc);
// builder.setCancelable(false);
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
builder.setPositiveButton("立刻更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showDownloadDialog();
}
});
builder.show();
}
/**
* 展示下载对话框
*/
private void showDownloadDialog() {
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("正在下载");
// 给下载对话框增加进度条
LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.version_update_progress, null);
downloadProgressBar = (ProgressBar) v.findViewById(R.id.update_progress);
builder.setView(v);
// 取消更新
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 隐藏对话框
dialog.dismiss();
// 设置取消状态
cancelUpdate = true;
}
});
downloadDialog = builder.create();
downloadDialog.show();
// 下载文件
downloadApk();
}
/**
* 下载apk文件
*/
private void downloadApk() {
new DownloadApkThread().start();
}
// 文件下载线程
private class DownloadApkThread extends Thread {
@Override
public void run() {
try {
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 获得存储卡的路径
String sdPath = Environment.getExternalStorageDirectory() + "/";
savePath = sdPath + "download";
URL url = new URL(downloadurl);
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
File file = new File(savePath);
// 判断文件目录是否存在
if (!file.exists()) {
file.mkdir();
}
File apkFile = new File(savePath, apkName);
FileOutputStream fos = new FileOutputStream(apkFile);
// 已下载量
int count = 0;
// 缓存
byte buf[] = new byte[1024];
// 写入到文件中,点击取消时停止下载
while (!cancelUpdate) {
int numread = is.read(buf);
count += numread;
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
// 更新进度
downloadHandler.sendEmptyMessage(DOWNLOADING);
if (numread <= 0) {
// 下载完成
downloadHandler.sendEmptyMessage(DOWNLOADED);
break;
}
// 写入文件
fos.write(buf, 0, numread);
}
fos.close();
is.close();
} else {
Toast.makeText(mContext, "当前的存储卡不可用,无法完成更新", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
}
// 取消下载对话框显示
downloadDialog.dismiss();
}
};
/**
* 安装apk文件
*/
private void install() {
File apkFile = new File(savePath, apkName);
if (apkFile.exists()) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + apkFile.toString()),
"application/vnd.android.package-archive");
mContext.startActivity(intent);
}
}
// 文件下载控制器
private Handler downloadHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWNLOADING:
// 正在下载,更新进度条
downloadProgressBar.setProgress(progress);
break;
case DOWNLOADED:
// 下载完成,安装文件
install();
break;
default:
break;
}
}
};
private void getPackageManage() {
PackageManager packageManager = mContext.getPackageManager();
PackageInfo packInfo = null;
try {
packInfo = packageManager.getPackageInfo(
mContext.getPackageName(), 0);
String version = packInfo.versionName;
clientVersionCode = String.valueOf(packInfo.versionCode);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
/* *//**
* 多线程的下载器
*
* @param downloadurl
*//*
private void download(String downloadurl) {
// 多线程断点下载。
HttpUtils http = new HttpUtils();
http.download(downloadurl, "/mnt/sdcard/temp.apk",
new RequestCallBack<File>() {
@Override
public void onSuccess(ResponseInfo<File> arg0) {
UIUtils.showToast(activity,"下载完成...");
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), "temp.apk")),
"application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}
@Override
public void onFailure(HttpException arg0, String arg1) {
ToastUtils.show(activity, "下载失败");
System.out.println(arg1);
arg0.printStackTrace();
//loadMainUI();
}
@Override
public void onLoading(long total, long current,
boolean isUploading) {
//tv_info.setText(current + "/" + total);
super.onLoading(total, current, isUploading);
}
});
}*/
}
以上就是版本检测与下载的 工具类, 直接引入项目即可,可能做法比较简单,勿喷... 里面有一个判断==0,表示不需要强制更新,==1表示需要强制更新,根据客户要求做的,就是这个json字段
Integer.valueOf(versionItem.getUpdatevs())==0
布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/update_progress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal" />
</LinearLayout>
上2个图片

