版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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年广告投放合作合同
- 康复科设备资源个性化配置策略
- 康复医疗医康养结合策略
- 应急物资储备质量保障体系构建
- 平坦型消化道早癌的共聚焦内镜识别策略
- 干细胞治疗心脏移植后排斥反应策略
- 带教资源利用率的提升策略
- 2025 AI办公工具全场景应用指南
- 师资培训效果反馈与持续改进
- 从8个数字看《建议》诞生记亲自擘画全程指导把脉定向
- 江苏省苏州市2023-2024学年八年级上学期期末语文试题及答案
- 家园的治理:环境科学概论学习通超星期末考试答案章节答案2024年
- 人工肩关节置换(反肩)
- 化纤织物染整精加工质量控制与检测技术
- 制定技术规范的目的与意义
- 2023-2024学年北京西城区高三(上)期末物理试卷(含答案)
- Q2-起重机司机实际操作技能考核作业指导书
- 黄金冶炼技术综述
- 农村低保制度建设情况调查报告
- 大国三农II-农业科技版知到章节答案智慧树2023年中国农业大学
- GA 1204-2014移动式消防储水装置
评论
0/150
提交评论