在App上线后可能后续对程序进行部分更新,版本更新的主要思想是打开app,在联网的情况下,请求服务器,判断服务器上App的版本号是否与手机上的app版本号相同,如果相同则程序正常进行,如果不同弹出对话框,提示用户是否更新app版本,如果更新则更新app,并完成安装。
<– 使用网络功能所需权限 –>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- SD卡读写权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1.获取当前程序的版本名字
/**
* 获取当前程序的版本名字
* @return 版本号名字
*/
public String getVersionName() {
String versionName = null;
// PackageManager 可以获取清单文件的所有信息(Gradle)
PackageManager manager = getPackageManager();
try {
// getPackageInfo 获取当前程序的包信息
PackageInfo packageInfo = manager.getPackageInfo("包名", 0);
versionName = packageInfo.versionName + "";
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
// can't reach
return "";
}
return versionName;
}
2.请求服务器获取服务器中app的版本信息进行比对,如果不同弹出对话框提示更新。
/**
* 下载一个新版本
*/
protected void downloadNewApk() {
httpUtils = new HttpUtils();
LogUtils.e("log", "下载新版本");
LogUtils.e("log", "下载位置: apk:" + apkUrl);
// 1.下载路径 2.目标路径
if (TextUtils.isEmpty(apkUrl)) {
return;
}
String fileName = apkUrl.substring(apkUrl.lastIndexOf("/"));
target = Environment.getExternalStorageDirectory().getPath() + fileName;//apk下载的位置
LogUtils.e("log", "下载位置:" + target + " apk:" + apkUrl);
httpUtils.download(apkUrl, target, new RequestCallBack<File>() {
// 下载成功时调用
@Override
public void onSuccess(ResponseInfo<File> arg0) {
Toast.makeText(getApplicationContext(), "下载成功!", Toast.LENGTH_SHORT).show();
tv_process.setVisibility(View.GONE);
// 安装新版本
installApk();
}
// 下载失败时调用
@Override
public void onFailure(HttpException arg0, String arg1) {
Toast.makeText(getApplicationContext(), "下载失败!", Toast.LENGTH_SHORT).show();
tv_process.setVisibility(View.GONE);
}
// 下载时调用
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
tv_process.setVisibility(View.VISIBLE);// 显示控件
tv_process.setText("当前进度:" + FormatUtils.sizeFormatNum2String(current) + "/" + "总进度:" + FormatUtils
.sizeFormatNum2String(total));
}
});
}
3.下载成功后,完成安装
/**
* 安装应用程序
*/
protected void installApk() {
// 调用系统的工程去安装 打开系统的apk 安装
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File(target)),
"application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}