Android自动检测版本及自动升级

步骤:

1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

效果图:

   

  

获取当前程序的版本号:

[java] view plaincopy

  1. /*
  2. * 获取当前程序的版本号
  3. */
  4. private String getVersionName() throws Exception{
  5. //获取packagemanager的实例
  6. PackageManager packageManager = getPackageManager();
  7. //getPackageName()是你当前类的包名,0代表是获取版本信息
  8. PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
  9. return packInfo.versionName;
  10. }

获取服务器端的版本号:

[java] view plaincopy

  1. /*
  2. * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
  3. */
  4. public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
  5. XmlPullParser  parser = Xml.newPullParser();
  6. parser.setInput(is, "utf-8");//设置解析的数据源
  7. int type = parser.getEventType();
  8. UpdataInfo info = new UpdataInfo();//实体
  9. while(type != XmlPullParser.END_DOCUMENT ){
  10. switch (type) {
  11. case XmlPullParser.START_TAG:
  12. if("version".equals(parser.getName())){
  13. info.setVersion(parser.nextText()); //获取版本号
  14. }else if ("url".equals(parser.getName())){
  15. info.setUrl(parser.nextText()); //获取要升级的APK文件
  16. }else if ("description".equals(parser.getName())){
  17. info.setDescription(parser.nextText()); //获取该文件的信息
  18. }
  19. break;
  20. }
  21. type = parser.next();
  22. }
  23. return info;
  24. }

从服务器下载apk:

[java] view plaincopy

  1. public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
  2. //如果相等的话表示当前的sdcard挂载在手机上并且是可用的
  3. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  4. URL url = new URL(path);
  5. HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
  6. conn.setConnectTimeout(5000);
  7. //获取到文件的大小
  8. pd.setMax(conn.getContentLength());
  9. InputStream is = conn.getInputStream();
  10. File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
  11. FileOutputStream fos = new FileOutputStream(file);
  12. BufferedInputStream bis = new BufferedInputStream(is);
  13. byte[] buffer = new byte[1024];
  14. int len ;
  15. int total=0;
  16. while((len =bis.read(buffer))!=-1){
  17. fos.write(buffer, 0, len);
  18. total+= len;
  19. //获取当前下载量
  20. pd.setProgress(total);
  21. }
  22. fos.close();
  23. bis.close();
  24. is.close();
  25. return file;
  26. }
  27. else{
  28. return null;
  29. }
  30. }

匹配、下载、自动安装:

[java] view plaincopy

  1. /*
  2. * 从服务器获取xml解析并进行比对版本号
  3. */
  4. public class CheckVersionTask implements Runnable{
  5. public void run() {
  6. try {
  7. //从资源文件获取服务器 地址
  8. String path = getResources().getString(R.string.serverurl);
  9. //包装成url的对象
  10. URL url = new URL(path);
  11. HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
  12. conn.setConnectTimeout(5000);
  13. InputStream is =conn.getInputStream();
  14. info =  UpdataInfoParser.getUpdataInfo(is);
  15. if(info.getVersion().equals(versionname)){
  16. Log.i(TAG,"版本号相同无需升级");
  17. LoginMain();
  18. }else{
  19. Log.i(TAG,"版本号不同 ,提示用户升级 ");
  20. Message msg = new Message();
  21. msg.what = UPDATA_CLIENT;
  22. handler.sendMessage(msg);
  23. }
  24. } catch (Exception e) {
  25. // 待处理
  26. Message msg = new Message();
  27. msg.what = GET_UNDATAINFO_ERROR;
  28. handler.sendMessage(msg);
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  33. Handler handler = new Handler(){
  34. @Override
  35. public void handleMessage(Message msg) {
  36. // TODO Auto-generated method stub
  37. super.handleMessage(msg);
  38. switch (msg.what) {
  39. case UPDATA_CLIENT:
  40. //对话框通知用户升级程序
  41. showUpdataDialog();
  42. break;
  43. case GET_UNDATAINFO_ERROR:
  44. //服务器超时
  45. Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();
  46. LoginMain();
  47. break;
  48. case DOWN_ERROR:
  49. //下载apk失败
  50. Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
  51. LoginMain();
  52. break;
  53. }
  54. }
  55. };
  56. /*
  57. *
  58. * 弹出对话框通知用户更新程序
  59. *
  60. * 弹出对话框的步骤:
  61. *  1.创建alertDialog的builder.
  62. *  2.要给builder设置属性, 对话框的内容,样式,按钮
  63. *  3.通过builder 创建一个对话框
  64. *  4.对话框show()出来
  65. */
  66. protected void showUpdataDialog() {
  67. AlertDialog.Builder builer = new Builder(this) ;
  68. builer.setTitle("版本升级");
  69. builer.setMessage(info.getDescription());
  70. //当点确定按钮时从服务器上下载 新的apk 然后安装
  71. builer.setPositiveButton("确定", new OnClickListener() {
  72. public void onClick(DialogInterface dialog, int which) {
  73. Log.i(TAG,"下载apk,更新");
  74. downLoadApk();
  75. }
  76. });
  77. //当点取消按钮时进行登录
  78. builer.setNegativeButton("取消", new OnClickListener() {
  79. public void onClick(DialogInterface dialog, int which) {
  80. // TODO Auto-generated method stub
  81. LoginMain();
  82. }
  83. });
  84. AlertDialog dialog = builer.create();
  85. dialog.show();
  86. }
  87. /*
  88. * 从服务器中下载APK
  89. */
  90. protected void downLoadApk() {
  91. final ProgressDialog pd;    //进度条对话框
  92. pd = new  ProgressDialog(this);
  93. pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  94. pd.setMessage("正在下载更新");
  95. pd.show();
  96. new Thread(){
  97. @Override
  98. public void run() {
  99. try {
  100. File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
  101. sleep(3000);
  102. installApk(file);
  103. pd.dismiss(); //结束掉进度条对话框
  104. } catch (Exception e) {
  105. Message msg = new Message();
  106. msg.what = DOWN_ERROR;
  107. handler.sendMessage(msg);
  108. e.printStackTrace();
  109. }
  110. }}.start();
  111. }
  112. //安装apk
  113. protected void installApk(File file) {
  114. Intent intent = new Intent();
  115. //执行动作
  116. intent.setAction(Intent.ACTION_VIEW);
  117. //执行的数据类型
  118. intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
  119. startActivity(intent);
  120. }
  121. /*
  122. * 进入程序的主界面
  123. */
  124. private void LoginMain(){
  125. Intent intent = new Intent(this,MainActivity.class);
  126. startActivity(intent);
  127. //结束掉当前的activity
  128. this.finish();
  129. }

UpdataInfo:

[java] view plaincopy

  1. public class UpdataInfo {
  2. private String version;
  3. private String url;
  4. private String description;
  5. public String getVersion() {
  6. return version;
  7. }
  8. public void setVersion(String version) {
  9. this.version = version;
  10. }
  11. public String getUrl() {
  12. return url;
  13. }
  14. public void setUrl(String url) {
  15. this.url = url;
  16. }
  17. public String getDescription() {
  18. return description;
  19. }
  20. public void setDescription(String description) {
  21. this.description = description;
  22. }
  23. }

update.xml:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <info>
  3. <version>2.0</version>
  4. <url>http://192.168.1.187:8080/mobilesafe.apk</url>
  5. <description>检测到最新版本,请及时更新!</description>
  6. </info>
时间: 2024-08-15 01:26:16

Android自动检测版本及自动升级的相关文章

android 实现检测版本,下载apk更新(附源码)

其实这不是什么难事了,都有热更新的技术了,只是记录一下,大神勿嘲笑. 先说下思路,首先要有更新的接口,只要进入app,就监测一下接口,是否更新,更新的话,检测本地版本是否低于接口返回的版本,低的话,就根据返回的路径下载apk更新.接口返回的字段起码有 更新标志.更新版本,更新描述,apk下载地址. 更新标志应该有三种状态,更新,询问更新,强制更新,可以启动一个Service(不要忘记在清单文件中注册)来进行检查更新以及下载的工作: 这下面就是 Service里的全部代码,也不是很难理解,重要的地

android的apk自动检测升级

首先获取本地apk版本: /** * 获取本地软件版本 */ public static int getLocalVersion(Context ctx){ int localVersion = 0; try { PackageInfo packageInfo = ctx.getApplicationContext() .getPackageManager().getPackageInfo(ctx.getPackageName(), 0); localVersion = packageInfo.

友盟在线参数+自动更新升级SDK实现指定版本强制更新升级

项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级. 友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位. 不过友盟的开发人员也给出了勉强可行的方案: 使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要 相关的内容如下: 1.在线参数配置: http://dev.umeng.com/analytics/android/advanced-integration-guide#3 2.强制更新官方代码: https://github.com/nxzhou

Android adt v22.6.2-1085508 自动创建 appcompat_v7 解决方法,最低版本2.2也不会出现

Android 开发工具升级到22.6.2在创建工程时只要选择的最低版本低于4.0,就会自动生成一个项目appcompat_v7,没创建一个新的项目都会自动创建,很是烦恼... 之前在网上也找过方法,都是天篇一律 创建工程时最低选择 4.0,但这样弊端很明显,不能 在低于4.0的版本上运行,应用的兼容性太弱了.. 也是烦恼了一段时间的,今天偶然发现了一个完美的解决方法 只要在创建工程的时候选择不创建Activity就可以解决了哈,很简单吧 Android adt v22.6.2-1085508

Android实现App版本自动更新

现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比. (1)如果服务器所返回的版本号大于当前App版本号那么此时手机所安装的App不是最新版.可以提示用户升级. (2)如果不大于当前版本号,可以提示用户为最新版本: 版本升级,也分为两种处理方式: (1)跳转到App某市场(例如:360手机助手),然后根据包名在市场定位到该App,通过市场下

Android Studio代码自动检测错误提示

Android Studio的代码自动检测的错误提示方式感觉有点奇葩,和Eclipse差别很大,Eclipse检测到某个资源文件找不到或者错误,都会在Project中对应的文件前面打叉,但是Android Studio不用这种方式,所以估计你刚开始找半天找不到错误提示到底在哪?这个错误提示的方式是直接进行了整理归类,不像Eclipse在对应的文件前打叉显示.那如何打开错误提示的列表,如下图: 做个补充,可能很多人会找不到Message在哪,其实你只要选择Build,然后把工程clean或者reb

Android从零单排之自动跟新

Android从零单排之自动跟新 转载请注明出处:http://blog.csdn.net/crazy1235/article/details/45584621 自动更新原理 当我们发布我们的应用程序的时候,肯定会想到后续版本的更新,那么该怎么对我们的程序进行更新呢? 更新APK的原理实际上就是比较程序中的AndroidManifest.xml中的versionCode进行对比,如果发现更高版本的code,则代表有新版本的程序发布,此时就可以对用户提示"请更新新版本". 友盟自动更新介

iOS自动检测版本更新

虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的. 首先说一下原理: 每个上架的苹果应用程序,都会有一个应用程序的ID,根据这个ID我们就可以获取到当前程序的最新版本号,然后和自己的版本号作比较,如果一样的话就是最新版,反之就不是新版,就可以提示用户来手动下载最新版的程序.因为有ID所以就可以定位到这个APP,点击下载即可. 源码: 一般建议检测更新的代码放到主页控制器里. 首先还要导入一个头文件用来打开App

iOS程序自动检测更新的实现

本文转载至 http://blog.csdn.net/davidsph/article/details/8931718 App Store自动更新itunes 之前项目需要用到app自动更新的功能,现将实现方案分享出来.iOS程序自动提示更新的实现方案大致分为两种:第一种,自己服务器提供一个接口,告知相关app的当前版本,是否需要更新,以及更新的地址等信息 .第二种,就是利用苹果的appstore 提供的相关api进行查询更新. 由于此前没有找到iOS程序更新的方法,就用了第一种方式,但后来发现