Android项目:手机安全卫士(2)—— 版本升级
1 介绍
前面讲了闪屏界面,现在来说说版本升级的问题,在闪屏界面的过程中,需要检测是否有新版本发布,若有,则提示用户升级。
项目源码地址1(实时更新):https://github.com/xwdoor/MobileSafe
项目源码地址2:http://download.csdn.net/detail/xwdoor/9443633
2 准备工作
在正式编码之前,需要进行一下准备工作:
- 上传高版本的 apk 安装文件
- 修改 update.json 文件,填充 dowloadUrl 这个字段,填上上述的 apk 安装文件的网络路径
3 显示升级对话框,提示用户升级
当检测到高版本时,提示用户升级,代码如下:
/**
* 显示升级对话框
*/
private void showUpdateDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.app_update);//设置标题:发现新版本
builder.setMessage(mRemoteAppInfo.getDescription());//设置内容
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//开始下载apk
downloadApk(mRemoteAppInfo.getDownloadUrl());
}
});
builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startMainActivity();
}
});
//点击返回键的监听
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
startMainActivity();
}
});
builder.show();
}
结果如图所示:
4 下载 APK 文件
当用户点击“立即更新”按钮时,开始下载 apk 文件,代码如下:
/**
* 下载APK
*
* @param downloadUrl apk文件的网络路径
*/
private void downloadApk(String downloadUrl) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "没有找到sdcard", Toast.LENGTH_SHORT).show();
return;
}
//显示下载进度
//mTvProgress.setVisibility(View.VISIBLE);
HttpUtils httpUtils = new HttpUtils();
//获取sdcard根目录
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/mobileSafe.apk";
httpUtils.download(downloadUrl, path, new RequestCallBack<File>() {
//下载成功
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
Log.i(TAG_LOG, "下载成功--->" + responseInfo.result.getAbsolutePath());
installApk(responseInfo.result.getAbsolutePath());
}
//下载失败
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(SplashActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
Log.i(TAG_LOG, "下载失败--->" + s);
startMainActivity();
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
Log.i(TAG_LOG, "total--->" + total + ",current--->" + current);
int percent = (int) (current * 100 / total);
mTvProgress.setText("下载进度:" + percent + "%");
}
});
}
这里没有再使用自己封装的网络访问工具类,使用第三方的开源项目进行 apk 的下载工作,但不知道为什么,下载进度显示不正确,可能是服务器的原因吧,因为我没有用本地服务器,算了,先不显示下载进度。
第三方开源项目叫 xUtils,GitHub 上面的项目,本文源代码中也有,下载后就有,但只是 jar 包。
5 安装 APK 文件
下载完成后,就开始安装 apk 文件了,代码如下:
/**
* 安装APK
*
* @param apkPath apk文件路径
*/
private void installApk(String apkPath) {
Log.d(TAG_LOG, "安装apk");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//安装过程中,用户点击取消按钮
startMainActivity();
}
6 进入主界面
在以下几种情况,需要进入主界面:
- 没有检测到新版本
- 提示用户升级后,用户点击了“以后再说”按钮
- 下载 apk 文件的过程中出错
- 安装 apk 文件的过程中用户点击取消按钮
总结
本文比较简单,只是涉及到提示用户升级、下载 apk、安装 apk 三部分,所以速度比较快,可能会出错,欢迎纠错。
项目源码地址1(实时更新):https://github.com/xwdoor/MobileSafe
项目源码地址2:http://download.csdn.net/detail/xwdoor/9443633