版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android应用升级,检测更新,下载,检验,安装
应用升级大致步骤:检测是否有更新(读取服务器config文件,比对版本号)若发现高版本则读取更新文件updateinfo.xml获取下载更新相关信息校验信息确认升级后,下载apk下载完apk后,进行MD5检验apk的完整性安装apk升级入口 private
void
upgrade()
{
//需要访问网络,避免主线程堵塞
new
Thread(){
public
void
run()
{
if(checkUpdate()){//检查更新
handler.sendEmptyMessage(20);//通知界面提示有版本更新
}
};
}.start();
}
private
boolean
checkUpdate(){
String
url
=
PATH_SERVER
+
"upgrade/config";
//从config文件读取Version信息,和UpdateInfo.xml文件地址
try
{
updateInfoMap
=
ParseUpdateFile.getConfigInfo(url);
}
catch
(Exception
e)
{
e.printStackTrace();
}
//获取当前apk的版本号
PackageInfo
packageInfo
=
null;
try
{
packageInfo
=
MainActivity.this.getPackageManager().getPackageInfo(MainActivity.this.getPackageName(),
0);
}
catch
(Exception
e)
{
e.printStackTrace();
}
int
updateVCode
=
Integer.valueOf(updateInfoMap.get("Version"));
//服务器端apk版本高于现在的版本,则读取updateinfo.xml文件
if(updateVCode
>
packageInfo.versionCode){
url
=
PATH_SERVER+"upgrade/updateinfo.xml";
try
{
updateInfoMap.putAll(ParseXmlUtil.parseXml(url));
}
catch
(Exception
e)
{
e.printStackTrace();
}
//输出读取结果
Set<String>
set
=
updateInfoMap.keySet();
System.out.println("map.size():"+updateInfoMap.size());
for
(Iterator<String>
iterator
=
set.iterator();
iterator.hasNext();)
{
String
string
=
(String)
iterator.next();
System.out.println(string
+
"——>"
+
updateInfoMap.get(string));
}
//检查信息合法性,通过则发送可更新消息
return
checkUpdateInfo(updateInfoMap);
}
return
false;
}解析config文件 public
static
Map<String,String>
getConfigInfo(String
strURL)
throws
Exception
{
Map<String,String>
configMap
=
new
HashMap<String,
String>();
URL
url
=
new
URL(strURL);
URLConnection
conn
=
url.openConnection();
if
(conn
==
null)
{
return
configMap;
}
InputStream
inputStream
=
conn.getInputStream();
InputStreamReader
inputStreamReader
=
new
InputStreamReader(inputStream);
BufferedReader
bufferedReader
=
new
BufferedReader(inputStreamReader);
String
str
=
null;
while
(null
!=
(str=bufferedReader.readLine()))
{
if
(str
!=
null)
{
if
(str.contains("Version="))
{
configMap.put("Version",
str.substring(str.indexOf("=")+1));
}
if
(str.contains("VersionServer"))
{
configMap.put("VersionServer",
str.substring(str.indexOf("::")+2));
}
}
}
bufferedReader.close();
return
configMap;
}checkUpdateInfo()主要校验信息的合法性 private
boolean
checkUpdateInfo(Map<String,
String>
updateInfoMap){
String
downloadPath
=
updateInfoMap.get("DownloadPath");
String
packageName
=
updateInfoMap.get("packageName");
String
versionCode
=
updateInfoMap.get("versionCode");
String
updateVCode
=
updateInfoMap.get("Version");
if
(checkUrl(downloadPath)//检测是否可访问
&&
versionCode.equals(updateVCode)//config和updateinfoxml文件中版本号是否一致
&&
packageName.equals(getPackageName()))
{//包名
return
true;
}
return
false;
}下载文件到设备需要权限<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> private
void
downLoadAPK(){
new
Thread()
{
public
void
run()
{
String
downLoadPath
=
updateInfoMap.get("DownloadPath");
String
downLoadDir
=
"/acfg/";
File
fileDir
=
new
File(downLoadDir);
if
(!fileDir.exists())
{
fileDir.mkdir();//创建文件夹
}
String
fileName
=
downLoadDir
+
downLoadPath.substring(downLoadPath.lastIndexOf("/")+1);
File
file
=
new
File(fileName);
if
(file.exists())
{
file.delete();//先删除之前已存在的文件
}
try
{
file.createNewFile();
URL
url
=
new
URL(downLoadPath);//
构造URL
URLConnection
con
=
url.openConnection();//
打开连接
int
contentLength
=
con.getContentLength();//
获得文件的长度
System.out.println("长度
:"
+
contentLength);
InputStream
is
=
con.getInputStream();//
输入流
byte[]
bs
=
new
byte[1024];//
1K的数据缓冲
int
len;//
读取到的数据长度
OutputStream
os
=
new
FileOutputStream(fileName);//
输出的文件流
//
开始读取
while
((len
=
is.read(bs))
!=
-1)
{
os.write(bs,
0,
len);
}
//
完毕,关闭所有链接
os.close();
is.close();
//保存文件路径,方便升级时使用
updateInfoMap.put("fileName",
fileName);
}
catch
(Exception
e)
{
e.printStackTrace();
handler.sendEmptyMessage(22);//下载失败
}
handler.sendEmptyMessage(21);//通知界面下载完成
};
}.start();
}下载完成后核对apk的MD5值File
file
=
new
File(fileName);
String
fileMD5
=
MD5Util.getMD5OfFile(file);
if
(fileMD5.equals(activity.updateInfoMap.get("md5sum")))
{
Toast.makeText(activity,
"Download
Finished.
It's
ready
to
update!",
Toast.LENGTH_LONG).show();
activity.update(fileName);
}获取文件的MD5值
public
static
String
getMD5OfFile(File
file)
{
String
value
=
null;
FileInputStream
in
=
null;
try
{
in
=
new
FileInputStream(file);
MappedByteBuffer
byteBuffer
=
in.getChannel().map(FileChannel.MapMode.READ_ONLY,
0,
file.length());
MessageDigest
md5
=
MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger
bi
=
new
BigInteger(1,
md5.digest());
value
=
bi.toString(16).toUpperCase(Locale.ENGLISH);//转为大写
}
catch
(Exception
e)
{
e.printStackTrace();
}
finally
{
if
(null
!=
in)
{
try
{
in.close();
}
catch
(IOException
e)
{
e.printStackTrace();
}
}
}
return
value;
}安装下载好的apk private
void
update(String
filePath)
{
Intent
i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石家庄市灵寿县2025-2026学年第二学期五年级语文第六单元测试卷(部编版含答案)
- 抚州市广昌县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 沈阳市东陵区2025-2026学年第二学期五年级语文第六单元测试卷(部编版含答案)
- 平凉地区庄浪县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 甘孜藏族自治州九龙县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 西安市阎良区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 忻州市五寨县2025-2026学年第二学期二年级语文第四单元测试卷(部编版含答案)
- 忻州市神池县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 郑州市新郑市2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 特殊方法测密度(带参考答案)
- 高速公路机电工程监理实施细则
- 2026年心理咨询师考试题库300道【含答案】
- 部编人教版六年级下册道德与法治课本练习题参考答案(全册)
- 雨课堂学堂在线学堂云《劳动与社会保障法学(辽宁大学 )》单元测试考核答案
- 2025年数据为基 AI为擎以应用打通价值链最后一公里报告
- 2026年大连职业技术学院单招职业技能测试题库及答案解析(名师系列)
- 2025年司法考试民事诉讼法真题及答案解析
- 2026年郑州电力高等专科学校单招职业适应性测试题库及答案1套
- 小儿肠系膜淋巴结炎课件
- 2025年鹤壁辅警协警招聘考试真题及答案详解(夺冠)
- (2025年版)绝经后宫腔积液诊治中国专家共识
评论
0/150
提交评论