Android编程实现自动检测版本及自动升级的方法
程序员文章站
2023-12-18 10:04:16
本文实例讲述了android编程实现自动检测版本及自动升级的方法。分享给大家供大家参考,具体如下:
步骤:
1.检测当前版本的信息androidmanifest.xml...
本文实例讲述了android编程实现自动检测版本及自动升级的方法。分享给大家供大家参考,具体如下:
步骤:
1.检测当前版本的信息androidmanifest.xml-->manifest-->android:versionname。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
效果图:
获取当前程序的版本号:
/* * 获取当前程序的版本号 */ private string getversionname() throws exception{ //获取packagemanager的实例 packagemanager packagemanager = getpackagemanager(); //getpackagename()是你当前类的包名,0代表是获取版本信息 packageinfo packinfo = packagemanager.getpackageinfo(getpackagename(), 0); return packinfo.versionname; }
获取服务器端的版本号:
/* * 用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:
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; } }
匹配、下载、自动安装:
/* * 从服务器获取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:
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:
<?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程序设计有所帮助。
推荐阅读
-
Android编程实现调用相册、相机及拍照后直接裁剪的方法
-
Android编程实现自定义Dialog的大小自动控制方法示例
-
Android编程实现设置按钮背景透明与半透明及图片背景透明的方法
-
Android编程实现下载图片及在手机中展示的方法
-
Android编程实现获取系统内存、CPU使用率及状态栏高度的方法示例
-
Android编程实现手绘及保存为图片的方法(附demo源码下载)
-
Android编程实现基于局域网udp广播自动建立socket连接的方法
-
Android编程实现调用相册、相机及拍照后直接裁剪的方法
-
Android编程实现两个Activity之间共享数据及互相访问的方法
-
Android编程实现ViewPager多页面滑动切换及动画效果的方法