在app上面有一个版本升级的功能,我们在服务器上传了新的安装包之后,就可以点击更新版本去拿到服务器上面的新包并更新
拿到当前版本的版本号:
/**
* 拿到versionName
*
* @return
*/
public String getPackageVersionName() {
//1.PackageManager 包的管理者对象
PackageManager pm = getPackageManager();
//2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
try {
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
String versionName = packageInfo.versionName;
return versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return "";
}
/**
* 拿到versionCode
*
* @return
*/
public int getPackageVersionCode() {
//1.PackageManager 包的管理者对象
PackageManager pm = getPackageManager();
//2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
try {
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
int versionCode = packageInfo.versionCode;
return versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return 0;
}
发送请求,拿到新版本的相关信息:
/**
* 请求服务器拿到新的app版本的相关信息
*
* @param updateURL
*/
private void getNewPackInfro(final String updateURL) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url(updateURL)//请求接口。如果需要传参拼接到接口后面。
.build();//创建Request 对象
Response response = null;
response = client.newCall(request).execute();//得到Response 对象
if (response.isSuccessful()) {
if (response.code() == 200) {
String res = null;
try {
res = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
checkVersion(res);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void checkVersion(String res) {
//拿到服务器返回的相关数据
//进行版本比较是否进行升级
System.out.println("返回的升级包数据:"+res);
try {
JSONObject jsonObject = new JSONObject(res);
JSONObject dataStr=new JSONObject(jsonObject.getString("data"));
String version=null;
version=dataStr.getString("version");
if(version.equals("null")){
Toast.makeText(getBaseContext(), "当前已经是最新版本了", Toast.LENGTH_SHORT).show();
}else{
downloadUrl=dataStr.getString("url");
//服务器有新版本,可供下载
runOnUiThread(new Runnable() {
@Override
public void run() {
showDialog();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
弹出是否下载新版本的提示:
/**
* 检查更新版本时的消息提示
*/
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// builder.setTitle("是否下载新版本?");
builder.setMessage("是否下载新版本");//设置对话框除标题外的描述内容
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//下载apk,下载路径downloadUrl,考虑在何处存储 files cache() sd卡
downloadApk();
}
});
builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//什么都不做
}
});
builder.setCancelable(false);
builder.show();
}
显示下载安装包的进度:
/**
* 下载新的apk文件
*/
private void downloadApk() {
//下载apk,并且指定放置下载文件的路径,sd卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//创建一个进度条对话框,用于显示下载进度
progressDialog = new ProgressDialog(this);
//默认情况下对话框进度条圆形转圈的
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(false);
progressDialog.show();
//手机的sd卡可用
//sd卡存储文件的路径
final String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "jizhixinxi/package" + "mobilesafe.apk";
//如何根据downloadUrl进行下载,okhttp下载
OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build();
Request request = new Request.Builder().get().url(downloadUrl).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败
Toast.makeText(SystemConfigActivity.this, "下载新版本失败请稍后重试", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功,从服务器的响应对象中获取apk,流(服务器 输入流(提供数据) 本地 输出流(写入文件))
ResponseBody body = response.body();
//告知progressDialog总进度,不变
progressDialog.setMax((int) body.contentLength());
//inputStream就是服务器把需要下载的apk以流的形式提供给客户端
InputStream inputStream = body.byteStream();
File file = new File(path);
FileOutputStream fos = new FileOutputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
int temp = 0;//用于记录目前下载的到的位置
while ((len = inputStream.read(bytes)) != -1) {
//将读过的数据写入文件中
fos.write(bytes, 0, len);
//告知progressDialog在下载过程中的当前进度
temp += len;
//将当前的下载位置,设置给progressDialog
progressDialog.setProgress(temp);
//没下载一段数据,睡眠一段时间
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//一旦循环结束,则sd卡中就有一个从服务器下载下来的apk
//下载完成后,则隐藏对话框
progressDialog.dismiss();
//安装apk,这个要装的apk在哪里
installApk(file);
}
});
}
}
让系统帮我们安装:
/**
* 安装指定路径下的apk
*
* @param file 需要安装文件的路径
*/
private void installApk(File file) {
//找到系统的安装界面,把安装过程中要用到的东西传递进去,让系统帮助我们安装.
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
//通过隐式意图开启系统的安装apk界面
startActivity(intent);
}