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应用更新-自动检测版本及自动升级
原文 http://www.cnblogs.com/keyindex/articles/1819504.html 注:实质,把自己新版的APK放在可以下载的地方,先自己设置个通信,检查版本,我是直接放 ...
- Android Studio2.x版本无法自动关联源码的解决方法
Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...
- Sublime 是自动检测而非自动设置缩进
以为是自动设置规范化的缩进 以前一直认为是:识别出文件类型后,设置统一的缩进规范.比如说 识别为CSS,就把缩进设成2个空格 其实是自动检测然后与你保持统一 亲测发现,根据你文本里用的是几个空格的缩进 ...
- Android 一个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...
- Android实现App版本自动更新
现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器返回的App版本与当前手机安装的版本号 ...
- 最新版自动检测卡片类型工具软件版本(auto check card type v3.2.0)
自动检测卡片类型工具软件. 卡片放到读卡器上面自动识别卡片类型,不需老是按下按钮,好用,方便.支持自动识别NTAG213卡片,NTAG215卡片, NTAG216卡片,Ultralight芯片, Ul ...
- iOS自动检测版本更新
虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的. 首先说一下原理: 每个上架的苹果应用程序,都会有一个应用程序的 ...
- IOS开发中如何实现自动检测更新APP
自动检测更新实现逻辑: 先上github地址:https://github.com/wolfhous/HSUpdateApp 1,获取当前项目APP版本号 2,拿到AppStore项目版本号 3,对比 ...
- js上传插件uploadify自动检测不到flash控件的问题
[问题描述] 项目开发中,由于使用了js的一个上传插件uploadify,下载的是flash版本的,后来在谷歌浏览器上运行时经常报flash控件未安装,虽然下图是uploadify自动检测自动弹出来的 ...
随机推荐
- 【转】在Eclipse中建立第一个Servlet程序
转载地址:http://kin111.blog.51cto.com/738881/163354 继上篇在Eclipse中搭好了tomcat环境后,我们建立一个最简单的servlet程序,这个serve ...
- Shuffle'm Up 分类: 函数 POJ 查找 2015-08-09 17:01 6人阅读 评论(0) 收藏
Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7529 Accepted: 3466 Descript ...
- Oracle插入时间
现象:Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配 解决方法: 这个错误一般出现在时间字段上,即你插入的时间格式和数据库现有的时间格式不一致,解决的方法是格式化你 插 ...
- 花40分钟写一个-CBIR引擎-代码公开
浏览网页的时候发现一篇不错的文章"用Python和OpenCV创建一个图片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在浏 ...
- 使用自定义材质球,实现NGUI屏幕溶解和灰显
UITexture实现的溶解: 重设UITeture的材质球实现上述效果,把当前屏幕渲染的Texture2D丢给UITexture,即可实现UI屏幕特效,背景模糊等都可以. 难点主要是实时刷新问题 解 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online HDU5878
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 解法:先保存,再二分查询~具体http://blog.csdn.net/coder_xia/arti ...
- Codeforces Round #368 (Div. 2) B
Description Masha wants to open her own bakery and bake muffins in one of the n cities numbered from ...
- MySQL的存储过程1
来源:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html MySQL的存储过程 2. 关于MySQL的存储过程存储过程是数据库存储的一个重要的功能 ...
- unicode下char*和CString和一些数据之间的转换
首先mfc下字符串只有两种数据:char(一个字节)和wchar_t(两个字节),很多其他数据类型如TCHAR,WCHAR等都是这个两个基本类型的宏定义,BYTE是uchar 1.对话框打印char* ...
- 【leetcode❤python】 219. Contains Duplicate II
#-*- coding: UTF-8 -*-#遍历所有元素,将元素值当做键.元素下标当做值#存放在一个字典中.遍历的时候,#如果发现重复元素,则比较其下标的差值是否小于k,#如果小于则可直接返回Tru ...