获取版本名称及版本号【在清单文件中】
<!-- android:versionCode="1"本地应用版本号1,版本号是2,有必要提示用户更新 -->
<!-- android:versionName="1.1.0";第一位表示项目重大更新(代码重构,大部分功能添加,界面整体修改),第二位表示更新部分功能,第一位表示修复原有的bug -->
首先我们先获取当前的版本号及版本名称(三步骤)
1、包管理者对象packageManager
PackageManager pm = getPackageManager()
2、从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号),传0代表获取基本信息
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
3、获取版本名称
return packageInfo.versionCode/versionName;
进而我们通过解析获取我们服务器版本号(客户端发请求,服务端给响应,(json,xml))
(json.xml中内容包含:更新版本的版本名称 新版本的描述信息 服务器版本号 新版本apk下载地址)
private void checkVerSion() {
new Thread() {
public void run() {
Message msg = Message.obtain();
long startTime = System.currentTimeMillis();
try {
// 1.封装一个url地址
URL url = new URL("http://192.168.0.104:8080/update.json");
// 2.开启一个url链接
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
// 3.设置常见的请求参数(请求头)
// 请求超时
urlConnection.setConnectTimeout(2000);
// 读取超时
urlConnection.setReadTimeout(2000);
// 4.获取响应码
if (urlConnection.getResponseCode() == 200) {
InputStream is = urlConnection.getInputStream();
String json = StreamUtil.streamToString(is);
Log.i(tag, json);
JSONObject jsonObject = new JSONObject(json);
String versionName = jsonObject
.getString("versionName");
String versionCode = jsonObject
.getString("versionCode");
mVersionDes = jsonObject.getString("versionDes");
mDownloadUrl = jsonObject.getString("downloadUrl");
Log.i(tag, versionName);
Log.i(tag, versionCode);
Log.i(tag, mVersionDes);
Log.i(tag, mDownloadUrl);
// 8、比对版本号
if (mLocalVerSionCode < Integer.parseInt(versionCode)) {
// 提示用户更新,弹出对话框
msg.what = UPDATE_CODE;
} else {
// 进入应用主界面
msg.what = ENTER_HOME;
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
msg.what = URL_ERROR;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
msg.what = IO_ERROR;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
msg.what = JSON_ERROR;
} finally {
long endTime = System.currentTimeMillis();
if ((startTime - endTime) < 4000) {
try {
Thread.sleep(4000 - (startTime - endTime));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mHandler.sendMessage(msg);
}
}
}.start();
}
Xutils使用过程
- 导入Xutils的jar包
- 添加Xutils需要的权限
- 获取HttpUtils对象,下载指定地址的APK
protected void downloadApk() {
//apk下载链接地址,放置apk的所在路径
//1,判断sd卡是否可用,是否挂在上
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//2,获取sd路径
String path = Environment.getExternalStorageDirectory().getAbsolutePath()
+File.separator+"Mymobilesafe.apk";
//3,发送请求,获取apk,并且放置到指定路径
HttpUtils httpUtils = new HttpUtils();
//4,发送请求,传递参数(下载地址,下载应用放置位置)
httpUtils.download(mDownloadUrl, path, new RequestCallBack() {
@Override
public void onSuccess(ResponseInfo responseInfo) {
//下载成功(下载过后的放置在sd卡中apk)
Log.i(tag, "下载成功");
File file = responseInfo.result;
//提示用户安装
installApk(file);
}
@Override
public void onFailure(HttpException arg0, String arg1) {
Log.i(tag, "下载失败");
//下载失败
}
//刚刚开始下载方法
@Override
public void onStart() {
Log.i(tag, "刚刚开始下载");
super.onStart();
}
//下载过程中的方法(下载apk总大小,当前的下载位置,是否正在下载)
@Override
public void onLoading(long total, long current,boolean isUploading) {
Log.i(tag, "下载中........");
Log.i(tag, "total = "+total);
Log.i(tag, "current = "+current);
super.onLoading(total, current, isUploading);
}
});
}
}
/**
* 安装对应的apk
*/
protected void installApk(File file) {
//系统应用界面,源码,安装apk入口
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
//文件作为数据源
//设置安装的类型
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}
/*
*
* 开启一个activity后,返回结果调用的方法
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
enterhome();
super.onActivityResult(requestCode, resultCode, data);
}
打包生成apk的过程
Android Tools——Export Signed Application Packagee
安装apk的过程注意事项
- 将原有应用覆盖文件,包名一致
- 签名一致(从Eclipse运行至手机上的应用,使用的是bin目录下的应用,使用debug.keyStore签名应用)
- 签名一致,包名不同(生成俩个APK,包名是应用的唯一性标志)
- 签名不同,包名一致,覆盖安装失败
安装对应apk
protected void installApk(File file) {
//系统应用界面,源码,安装apk入口
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
//文件作为数据源
//设置安装的类型
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
startActivityForResult(intent, 0);
}