版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024铁艺大门防盗安全门研发与制造合同3篇
- 二零二五年度绿色出行n95口罩配送与回收服务合同3篇
- 2025年度煤矿土地租赁合同书4篇
- 2024西安存量房交易资金监管服务合同
- 二零二五年度网络安全咨询与管理服务合同范本
- 2025版电子信息产业零配件绿色供应链管理合同4篇
- 2025年度互联网金融服务合同6篇
- 年度水解弹性蛋白产业分析报告
- 年度皮肤科医院市场分析及竞争策略分析报告
- 2024-2025学年新教材高中政治第3单元经济全球化第7课第1框开放是当代中国的鲜明标识课时分层作业含解析新人教版选择性必修1
- 河南省信阳市浉河区9校联考2024-2025学年八年级上学期12月月考地理试题(含答案)
- 火灾安全教育观后感
- 农村自建房屋安全协议书
- 快速康复在骨科护理中的应用
- 国民经济行业分类和代码表(电子版)
- ICU患者外出检查的护理
- 公司收购设备合同范例
- 广东省潮州市2023-2024学年高二上学期语文期末考试试卷(含答案)
- 2024年光伏发电项目EPC总包合同
- 子女放弃房产继承协议书
- 氧化还原反应配平专项训练
评论
0/150
提交评论