本文实例讲述了android编程实现自动检测版本及自动升级的方法。分享给大家供大家参考,具体如下:
步骤:
1.检测当前版本的信息androidmanifest.xml-->manifest-->android:versionname。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
效果图:
获取当前程序的版本号:
1
2
3
4
5
6
7
8
9
10
|
/* * 获取当前程序的版本号 */ private string getversionname() throws exception{ //获取packagemanager的实例 packagemanager packagemanager = getpackagemanager(); //getpackagename()是你当前类的包名,0代表是获取版本信息 packageinfo packinfo = packagemanager.getpackageinfo(getpackagename(), 0 ); return packinfo.versionname; } |
获取服务器端的版本号:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/* * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号) */ public static updatainfo getupdatainfo(inputstream is) throws exception{ xmlpullparser parser = xml.newpullparser(); parser.setinput(is, "utf-8" ); //设置解析的数据源 int type = parser.geteventtype(); updatainfo info = new updatainfo(); //实体 while (type != xmlpullparser.end_document ){ switch (type) { case xmlpullparser.start_tag: if ( "version" .equals(parser.getname())){ info.setversion(parser.nexttext()); //获取版本号 } else if ( "url" .equals(parser.getname())){ info.seturl(parser.nexttext()); //获取要升级的apk文件 } else if ( "description" .equals(parser.getname())){ info.setdescription(parser.nexttext()); //获取该文件的信息 } break ; } type = parser.next(); } return info; } |
从服务器下载apk:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public static file getfilefromserver(string path, progressdialog pd) throws exception{ //如果相等的话表示当前的sdcard挂载在手机上并且是可用的 if (environment.getexternalstoragestate().equals(environment.media_mounted)){ url url = new url(path); httpurlconnection conn = (httpurlconnection) url.openconnection(); conn.setconnecttimeout( 5000 ); //获取到文件的大小 pd.setmax(conn.getcontentlength()); inputstream is = conn.getinputstream(); file file = new file(environment.getexternalstoragedirectory(), "updata.apk" ); fileoutputstream fos = new fileoutputstream(file); bufferedinputstream bis = new bufferedinputstream(is); byte [] buffer = new byte [ 1024 ]; int len ; int total= 0 ; while ((len =bis.read(buffer))!=- 1 ){ fos.write(buffer, 0 , len); total+= len; //获取当前下载量 pd.setprogress(total); } fos.close(); bis.close(); is.close(); return file; } else { return null ; } } |
匹配、下载、自动安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* * 从服务器获取xml解析并进行比对版本号 */ public class checkversiontask implements runnable{ public void run() { try { //从资源文件获取服务器 地址 string path = getresources().getstring(r.string.serverurl); //包装成url的对象 url url = new url(path); httpurlconnection conn = (httpurlconnection) url.openconnection(); conn.setconnecttimeout(5000); inputstream is =conn.getinputstream(); info = updatainfoparser.getupdatainfo(is); if(info.getversion().equals(versionname)){ log.i(tag,"版本号相同无需升级"); loginmain(); }else{ log.i(tag,"版本号不同 ,提示用户升级 "); message msg = new message(); msg.what = updata_client; handler.sendmessage(msg); } } catch (exception e) { // 待处理 message msg = new message(); msg.what = get_undatainfo_error; handler.sendmessage(msg); e.printstacktrace(); } } } handler handler = new handler(){ @override public void handlemessage(message msg) { // todo auto-generated method stub super.handlemessage(msg); switch (msg.what) { case updata_client: //对话框通知用户升级程序 showupdatadialog(); break; case get_undatainfo_error: //服务器超时 toast.maketext(getapplicationcontext(), "获取服务器更新信息失败", 1).show(); loginmain(); break; case down_error: //下载apk失败 toast.maketext(getapplicationcontext(), "下载新版本失败", 1).show(); loginmain(); break; } } }; /* * * 弹出对话框通知用户更新程序 * * 弹出对话框的步骤: * 1.创建alertdialog的builder. * 2.要给builder设置属性, 对话框的内容,样式,按钮 * 3.通过builder 创建一个对话框 * 4.对话框show()出来 */ protected void showupdatadialog() { alertdialog.builder builer = new builder(this) ; builer.settitle("版本升级"); builer.setmessage(info.getdescription()); //当点确定按钮时从服务器上下载 新的apk 然后安装 builer.setpositivebutton("确定", new onclicklistener() { public void onclick(dialoginterface dialog, int which) { log.i(tag,"下载apk,更新"); downloadapk(); } }); //当点取消按钮时进行登录 builer.setnegativebutton("取消", new onclicklistener() { public void onclick(dialoginterface dialog, int which) { // todo auto-generated method stub loginmain(); } }); alertdialog dialog = builer.create(); dialog.show(); } /* * 从服务器中下载apk */ protected void downloadapk() { final progressdialog pd; //进度条对话框 pd = new progressdialog(this); pd.setprogressstyle(progressdialog.style_horizontal); pd.setmessage("正在下载更新"); pd.show(); new thread(){ @override public void run() { try { file file = downloadmanager.getfilefromserver(info.geturl(), pd); sleep(3000); installapk(file); pd.dismiss(); //结束掉进度条对话框 } catch (exception e) { message msg = new message(); msg.what = down_error; handler.sendmessage(msg); e.printstacktrace(); } }}.start(); } //安装apk protected void installapk(file file) { intent intent = new intent(); //执行动作 intent.setaction(intent.action_view); //执行的数据类型 intent.setdataandtype(uri.fromfile(file), "application/vnd.android.package-archive"); startactivity(intent); } /* * 进入程序的主界面 */ private void loginmain(){ intent intent = new intent( this ,mainactivity. class ); startactivity(intent); //结束掉当前的activity this .finish(); } |
updatainfo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class updatainfo { private string version; private string url; private string description; public string getversion() { return version; } public void setversion(string version) { this .version = version; } public string geturl() { return url; } public void seturl(string url) { this .url = url; } public string getdescription() { return description; } public void setdescription(string description) { this .description = description; } } |
update.xml:
1
2
3
4
5
6
|
<?xml version= "1.0" encoding= "utf-8" ?> <info> <version> 2.0 </version> <url>http: //192.168.1.187:8080/mobilesafe.apk</url> <description>检测到最新版本,请及时更新!</description> </info> |
希望本文所述对大家android程序设计有所帮助。