更新插件代码: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. VC读取文件内容

    // chopper.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...

  2. SqlCacheDependency轮询数据库表的更改情况的频率

    下面的示例向 ASP.NET 应用程序添加一个 SqlCacheDependency.   <sqlCacheDependency enabled="true" pollTi ...

  3. bt种子文件是什么(包括bt文件结构)

    bt种子文件是什么(包括bt文件结构) 一.总结 一句话总结:带特定格式特定信息(资源的url相关信息)的一个字符串(和json有点异曲同工之妙的感觉). 1.bt种子文件和json的区别和联系? 共 ...

  4. spring: 使用profiles选择数据源(结合嵌入式数据源EmbeddedDatabaseBuilder)

    一般需要在不同的环境(日常环境.性能测试环境.预发环境和生产环境等等)中配置不同的数据源,例如,在开发时非常适合使用嵌入式数据源.在QA环境中比较适合使用DBCP的BasicDataSource.在生 ...

  5. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  6. C# WPF DataGrid 隔行变色及内容居中对齐

    C# WPF DataGrid 隔行变色及内容居中对齐. dqzww NET学习0     先看效果: 前台XAML代码: <!--引入样式文件--> <Window.Resourc ...

  7. WPF中的事件及冒泡事件和隧道事件(预览事件)的区别

    WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别   WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别 本文摘要: 1:什么是路由事件: 2:中断事件路 ...

  8. js比较函数

    //1.//bySort函数接受一个首要比较字符串和一个可选的次要比较函数做为参数//并返回一个可以用来包含该成员的对象数组进行排序的比较函数//当o[firstName] 和 p[firstName ...

  9. New Concept English three (49)

    31w/m 51error It is a good thing my aunt Harriet died years ago. If she were alive today she would n ...

  10. Ubuntu 安装arm-linux-gcc编译器

    /********************************************************************************** * Ubuntu 安装arm-l ...