更新插件代码: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. PHP(Zend Studio)入门视频

    视频地址: http://www.ev-get.com/article/2014/5/9/20962.html (去掉地址中的减号-:可以看视频) Zend Studio教学视频之Zend Studi ...

  2. [转载]spring security 的 logout 功能

    原文地址:security 的 logout 功能">spring security 的 logout 功能作者:sumnny 转载自:http://lengyun3566.iteye ...

  3. 【转】Android应用中使用AsyncHttpClient来异步网络数据

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  4. mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(一搭建开发环境——建立NFS服务器)

    http://blog.csdn.net/yinjiabin/article/details/7489030 建立 nfs 服务器 在嵌入式 linux 开发的时候,常常需要使用 nfs 以方便程序的 ...

  5. 免配置环境变量使用Tomcat+设置项目主页路径为http://localhost:8080+修改tomcat端口号

    一.免配置jdk JAVA_HOME和tomcat  CATALINA_HOME环境变量使用tomcat 众说周知,使用tomcat需要有java环境,一般情况下需要配置jdk和tomcat的路径到w ...

  6. Spring初学之annotation实现AOP前置通知和后置通知

    实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

  7. Springboot- pagehelper使用

    1.添加pagehelper依赖 <dependency> <groupId>org.github.pagehelper</groupId> <artifac ...

  8. Bellman-Ford算法 O(NE)

    Bellman-Ford算法 O(NE) 思路:枚举n-1次所有边,通过枚举所有边,将所有和已知点相连的点都设为已知,初始时起点为已知点. ;i<=n-;i++){ //n-1是次数,枚举n-1 ...

  9. Advanced SQL: Relational division in jOOQ

              i   Rate This Relational algebra has its treats. One of the most academic features is the ...

  10. Javascript-理解事件总结

    事件 [事件流]表述的是从页面接收事件的顺序.1.事件冒泡流:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档).所有浏览器都支持.2.事件捕获:与事件冒泡相反,事件捕获的用意在 ...