更新插件代码:https://github.com/shixy/UpdateApp

来源:http://aspoems.iteye.com/blog/1897300

检查更新的时候,通过指定的URL获取服务器端版本信息。比较版本,如果更新,访问服务器端返回的apk的URL地址,下载,安装。各种 Makert 也是通过类似的机制实现的。原理搞清楚了,代码就相当简单了。

获取apk的VesionName,即AndroidManifest.xml中定义的android:versionName

  1. public String getVesionName(Context context) {
  2. String versionName = null;
  3. try {
  4. versionName = context.getPackageManager().getPackageInfo("net.vpntunnel", 0).versionName;
  5. } catch (NameNotFoundException e) {
  6. Log.e(TAG, e.getMessage());
  7. }
  8. return versionName;
  9. }

复制代码

更新以及安装程序需要的权限,在AndroidManifest.xml中添加

  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  3. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
  4. <uses-permission android:name="android.permission.INSTALL_PACKAGES"></uses-permission>

复制代码

获取apk的versionCode,即AndroidManifest.xml中定义的android:versionCode

  1. public int getVersionCode(Context context) {
  2. int versionCode = 0;
  3. try {
  4. versionCode = context.getPackageManager().getPackageInfo("net.vpntunnel", 0).versionCode;
  5. } catch (NameNotFoundException e) {
  6. Log.e(TAG, e.getMessage());
  7. }
  8. return versionCode;
  9. }

复制代码

服务器端version.JSON,包含apk路径以及版本信息

  1. {
  2. "ApkName":"NAME",
  3. "ApkFullName":"NAME_1.0.5.apk",
  4. "VersionName":"1.0.5",
  5. "VersionCode":3
  6. }

复制代码

获取远程服务器的版本信息

  1. private void getRemoteJSON(string host) throws ClientProtocolException, IOException, JSONException {
  2. String url = String.format("http://%s/%s", host, VER_JSON);
  3. StringBuilder sb = new StringBuilder();
  4. HttpClient client = new DefaultHttpClient();
  5. HttpParams httpParams = client.getParams();
  6. HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
  7. HttpConnectionParams.setSoTimeout(httpParams, 5000);
  8. HttpResponse response = client.execute(new HttpGet(url));
  9. HttpEntity entity = response.getEntity();
  10. if (entity != null) {
  11. BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"), 8192);
  12. String line = null;
  13. while ((line = reader.readLine()) != null) {
  14. sb.append(line + "\n");
  15. }
  16. reader.close();
  17. }
  18. JSONObject object = (JSONObject) new JSONTokener(sb.toString()).nextValue();
  19. this.apkFullName = object.getString("ApkFullName");
  20. this.versionName = object.getString("VersionName");
  21. this.versionCode = Integer.valueOf(object.getInt("VersionCode"));
  22. }

复制代码

发现更新的提醒窗口,通过AlertDialog实现

  1. private void shoVersionUpdate(String newVersion, final String updateURL) {
  2. String message = String.format("%s: %s, %s", mContext.getString(R.string.found_newversion), newVersion, mContext.getString(R.string.need_update));
  3. AlertDialog dialog = new AlertDialog.Builder(mContext).setTitle(mContext.getString(R.string.alertdialog_title)).setMessage(message)
  4. // update
  5. .setPositiveButton(mContext.getString(R.string.alertdialog_update_button), new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. pBar = new ProgressDialog(mContext);
  9. pBar.setTitle(mContext.getString(R.string.progressdialog_title));
  10. pBar.setMessage(mContext.getString(R.string.progressdialog_message));
  11. pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  12. dialog.dismiss();
  13. downFile(updateURL);
  14. }
  15. // cancel
  16. }).setNegativeButton(mContext.getString(R.string.alertdialog_cancel_button), new DialogInterface.OnClickListener() {
  17. public void onClick(DialogInterface dialog, int whichButton) {
  18. dialog.dismiss();
  19. }
  20. }).create();
  21. dialog.show();
  22. }

复制代码

下载新版的apk文件,存放地址可以放到SD卡中。通过Environment.getExternalStorageDirectory()获取SD卡中的路径

  1. private void downFile(final String url) {
  2. pBar.show();
  3. new Thread() {
  4. public void run() {
  5. HttpClient client = new DefaultHttpClient();
  6. HttpGet get = new HttpGet(url);
  7. HttpResponse response;
  8. try {
  9. response = client.execute(get);
  10. HttpEntity entity = response.getEntity();
  11. long length = entity.getContentLength();
  12. InputStream is = entity.getContent();
  13. FileOutputStream fileOutputStream = null;
  14. if (is != null) {
  15. File f = new File(UPDATE_DIR);
  16. if (!f.exists()) {
  17. f.mkdirs();
  18. }
  19. fileOutputStream = new FileOutputStream(new File(UPDATE_DIR, updateFileName));
  20. byte[] buf = new byte[1024];
  21. int ch = -1;
  22. int count = 0;
  23. while ((ch = is.read(buf)) != -1) {
  24. fileOutputStream.write(buf, 0, ch);
  25. count += ch;
  26. Log.d(TAG, String.valueOf(count));
  27. if (length > 0) {
  28. }
  29. }
  30. }
  31. fileOutputStream.flush();
  32. if (fileOutputStream != null) {
  33. fileOutputStream.close();
  34. }
  35. handler.post(new Runnable() {
  36. public void run() {
  37. pBar.cancel();
  38. installUpdate();
  39. }
  40. });
  41. } catch (Exception e) {
  42. pBar.cancel();
  43. Log.e(TAG, e.getMessage());
  44. }
  45. }
  46. }.start();
  47. }

复制代码

安装更新

  1. private void installUpdate() {
  2. Intent intent = new Intent(Intent.ACTION_VIEW);
  3. intent.setDataAndType(Uri.fromFile(new File(UPDATE_DIR, updateFileName)), "application/vnd.android.package-archive");
  4. mContext.startActivity(intent);
  5. }

复制代码

至此更新需要函数就完成了

app自动更新(android)的更多相关文章

  1. Android学习系列(3)--App自动更新之自定义进度视图和内部存储

    友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...

  2. H5+app -- 自动更新

    一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 :  http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...

  3. web app升级—带进度条的App自动更新

    带进度条的App自动更新,效果如下图所示:   技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template> <div> <va ...

  4. Web APP自动更新

    我们的手机软件每天都要经营,经常需要更新,比如程序的Bug,好的功能,好的洁面... ... 这就需要我们的用户打开web app时候自动更新客户端程序,而不是再去应用程序商店从新下载.今天的笔记就是 ...

  5. Android App自动更新解决方案(DownloadManager)

    一开始,我们先向服务器请求数据获取版本 public ObservableField<VersionBean> appVersion = new ObservableField<&g ...

  6. Android 云服务器的搭建和友盟APP自动更新功能的实现

    setContentView(R.layout.activity_splash); //Bmob SDK初始化--只需要这一段代码即可完成初始化 //请到Bmob官网(http://www.bmob. ...

  7. 安卓---app自动更新

    主要参考:http://blog.csdn.net/jdsjlzx/article/details/46356013/ 效果如下: 大致思路:[原文] 首先,我们要有一个可以被手机访问的后台. 这里有 ...

  8. App自动更新(DownloadManager下载器)

    一.开门见山 代码: object AppUpdateManager { const val APP_UPDATE_APK = "update.apk" private var b ...

  9. 解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题

    转自cocoachina iOS 7能在后台自动app,这对开发者来说和用户都很方便,但是还是有一些缺点.用户不会知道app本次更新的内容,除非他们上到app的App Store页面去查看.开发者也会 ...

随机推荐

  1. sql server update时,是行锁还是表锁

    https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 问题: udpat ...

  2. 论4.1loli模拟赛

    论如何合理的挂.... T1: 后缀数组+找规律...没了,别的就没什么了.... T2: 树链剖分+lca....没了, 别的没什么了..... T3: 平衡树可过..然后数据有两组错的... 实际 ...

  3. 手机APP和微信小程序能否取代域名?

    有人说现在App是主流,手机上装几个App就可以了,以后域名的重要性会越来越低,直至App完全取代域名的域名无用论.真的是这样吗? 关于这个话题已经有很多先人前辈探讨过,这次誉名网从另外一个角度给各位 ...

  4. SoapUI使用方法-01发送http请求

    soap ui http://blog.csdn.net/russ44/article/details/51680083 一.发送HTTP请求消息 1.打开soapUI. 2.新建一个项目,实例如下: ...

  5. this关键字详解

    在java中,编译器会为每个对象分配一个this关键字.在代码中使用关键字可以使代码更优雅.下面我就列举一下this关键字常见的几种场景. 1.this代表当前对象调用成员变量和方法,也是用的最多的地 ...

  6. Java执行过程

    Java的运行原理 在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能 ...

  7. [Kafka] - Kafka内核理解:分布式机制

    一个Topic中的所有数据分布式的存储在kafka集群的所有机器(broker)上,以分区(partition)的的形式进行数据存储:每个分区允许存在备份数据/备份分区(存储在同一kafka集群的其它 ...

  8. swoole帮助文档

    入门指引 [编辑本页] Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同.普通的扩展只是提供一个库函数.而swoole扩展在运行后会接管PHP的控制权,进入事件循环.当IO事件发生后,swo ...

  9. Template、ItemsPanel、ItemContainerStyle、ItemTemplate(包括ListBox的Item子项是横向排列)

    Template.ItemsPanel.ItemContainerStyle.ItemTemplate 分类: WPF2011-10-12 10:13 4716人阅读 评论(0) 收藏 举报 data ...

  10. hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...

    一.异常现象 启动hbase的时,hbase的日志中可以发现: Waiting for dfs to exit safe mode... 然后就抛异常了 2018-03-22 17:00:28,994 ...