更新插件代码: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. 1.mysql导论

    虽然之前用过mysql一年多,但大多只是会用,深入了解的不多.所以想利用平时时间 系统的总结总结. 一.什么是数据库:(数据库软件)     1).什么是数据库(软件):数据库(DB:DataBase ...

  2. 关于CDN

    DNS域名解析过程 DNS即Domain Name System,是域名解析服务的意思.它在互联网的作用是:把域名转换成为网络可以识别的ip地址.人们习惯记忆域名,但机器间互相只认IP地址,域名与IP ...

  3. PBKDF2加密

    password - the password that needs to be hashed. This should be convertedinto a char array before pa ...

  4. XE8_TPaintBox画

    1. procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); var bitmap :TBitMap; pt1, pt2 ...

  5. Windows下软件调试

    1. 视频: (1).VS下的C++调试方法.wnv (2).WinDbg高级调试技术.wmv (3).内存与句柄泄漏处理技巧.wmv 2. “WinDbg高级调试技巧” 中 [01:22]讲到“软件 ...

  6. 浏览器指纹--纯js拿到浏览器指纹

    序言: 前两天有接收到一下问题,如何拿到浏览器指纹中的位置信息和CPU,在这之前完全没有接触过浏览器指纹,抱着学习和好奇的心态,就去网上查了大量的资料.下面我将学习过程和成果贴出来给大家. 步骤 1. ...

  7. webservice 交错数组

    net webservices public DataSet SelectOPQuestionByWhere(string strWhere, string[][] strArry) { if (!k ...

  8. .net mvc超过了最大请求长度

    项目中遇到"超过了最大请求长度"如下图所示,是因为IIS默认请求长度4M,当请求长度大于这个值的时候报错. 修改maxRequestLength:在web.config中我们修改& ...

  9. substr 方法

    substr 方法 返回一个从指定位置开始,并具有指定长度的子字符串. 参数 start 必选.所需的子字符串的起始位置.字符串中第一个字符的索引为 0. length 可选项.返回的子字符串中包含的 ...

  10. nyojb 2357

    http://acm.nyist.me/JudgeOnline/problem.php?id=2357 2357: 插塔憋憋乐 时间限制: 1 Sec  内存限制: 128 MB提交: 50  解决: ...