app自动更新(android)
更新插件代码:https://github.com/shixy/UpdateApp
来源:http://aspoems.iteye.com/blog/1897300
检查更新的时候,通过指定的URL获取服务器端版本信息。比较版本,如果更新,访问服务器端返回的apk的URL地址,下载,安装。各种 Makert 也是通过类似的机制实现的。原理搞清楚了,代码就相当简单了。
获取apk的VesionName,即AndroidManifest.xml中定义的android:versionName
- public String getVesionName(Context context) {
- String versionName = null;
- try {
- versionName = context.getPackageManager().getPackageInfo("net.vpntunnel", 0).versionName;
- } catch (NameNotFoundException e) {
- Log.e(TAG, e.getMessage());
- }
- return versionName;
- }
复制代码
更新以及安装程序需要的权限,在AndroidManifest.xml中添加
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
- <uses-permission android:name="android.permission.INSTALL_PACKAGES"></uses-permission>
复制代码
获取apk的versionCode,即AndroidManifest.xml中定义的android:versionCode
- public int getVersionCode(Context context) {
- int versionCode = 0;
- try {
- versionCode = context.getPackageManager().getPackageInfo("net.vpntunnel", 0).versionCode;
- } catch (NameNotFoundException e) {
- Log.e(TAG, e.getMessage());
- }
- return versionCode;
- }
复制代码
服务器端version.JSON,包含apk路径以及版本信息
- {
- "ApkName":"NAME",
- "ApkFullName":"NAME_1.0.5.apk",
- "VersionName":"1.0.5",
- "VersionCode":3
- }
复制代码
获取远程服务器的版本信息
- private void getRemoteJSON(string host) throws ClientProtocolException, IOException, JSONException {
- String url = String.format("http://%s/%s", host, VER_JSON);
- StringBuilder sb = new StringBuilder();
- HttpClient client = new DefaultHttpClient();
- HttpParams httpParams = client.getParams();
- HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
- HttpConnectionParams.setSoTimeout(httpParams, 5000);
- HttpResponse response = client.execute(new HttpGet(url));
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"), 8192);
- String line = null;
- while ((line = reader.readLine()) != null) {
- sb.append(line + "\n");
- }
- reader.close();
- }
- JSONObject object = (JSONObject) new JSONTokener(sb.toString()).nextValue();
- this.apkFullName = object.getString("ApkFullName");
- this.versionName = object.getString("VersionName");
- this.versionCode = Integer.valueOf(object.getInt("VersionCode"));
- }
复制代码
发现更新的提醒窗口,通过AlertDialog实现
- private void shoVersionUpdate(String newVersion, final String updateURL) {
- String message = String.format("%s: %s, %s", mContext.getString(R.string.found_newversion), newVersion, mContext.getString(R.string.need_update));
- AlertDialog dialog = new AlertDialog.Builder(mContext).setTitle(mContext.getString(R.string.alertdialog_title)).setMessage(message)
- // update
- .setPositiveButton(mContext.getString(R.string.alertdialog_update_button), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- pBar = new ProgressDialog(mContext);
- pBar.setTitle(mContext.getString(R.string.progressdialog_title));
- pBar.setMessage(mContext.getString(R.string.progressdialog_message));
- pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- dialog.dismiss();
- downFile(updateURL);
- }
- // cancel
- }).setNegativeButton(mContext.getString(R.string.alertdialog_cancel_button), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- dialog.dismiss();
- }
- }).create();
- dialog.show();
- }
复制代码
下载新版的apk文件,存放地址可以放到SD卡中。通过Environment.getExternalStorageDirectory()获取SD卡中的路径
- private void downFile(final String url) {
- pBar.show();
- new Thread() {
- public void run() {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
- HttpResponse response;
- try {
- response = client.execute(get);
- HttpEntity entity = response.getEntity();
- long length = entity.getContentLength();
- InputStream is = entity.getContent();
- FileOutputStream fileOutputStream = null;
- if (is != null) {
- File f = new File(UPDATE_DIR);
- if (!f.exists()) {
- f.mkdirs();
- }
- fileOutputStream = new FileOutputStream(new File(UPDATE_DIR, updateFileName));
- byte[] buf = new byte[1024];
- int ch = -1;
- int count = 0;
- while ((ch = is.read(buf)) != -1) {
- fileOutputStream.write(buf, 0, ch);
- count += ch;
- Log.d(TAG, String.valueOf(count));
- if (length > 0) {
- }
- }
- }
- fileOutputStream.flush();
- if (fileOutputStream != null) {
- fileOutputStream.close();
- }
- handler.post(new Runnable() {
- public void run() {
- pBar.cancel();
- installUpdate();
- }
- });
- } catch (Exception e) {
- pBar.cancel();
- Log.e(TAG, e.getMessage());
- }
- }
- }.start();
- }
复制代码
安装更新
- private void installUpdate() {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(new File(UPDATE_DIR, updateFileName)), "application/vnd.android.package-archive");
- mContext.startActivity(intent);
- }
复制代码
至此更新需要函数就完成了
app自动更新(android)的更多相关文章
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...
- H5+app -- 自动更新
一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 : http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...
- web app升级—带进度条的App自动更新
带进度条的App自动更新,效果如下图所示: 技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template> <div> <va ...
- Web APP自动更新
我们的手机软件每天都要经营,经常需要更新,比如程序的Bug,好的功能,好的洁面... ... 这就需要我们的用户打开web app时候自动更新客户端程序,而不是再去应用程序商店从新下载.今天的笔记就是 ...
- Android App自动更新解决方案(DownloadManager)
一开始,我们先向服务器请求数据获取版本 public ObservableField<VersionBean> appVersion = new ObservableField<&g ...
- Android 云服务器的搭建和友盟APP自动更新功能的实现
setContentView(R.layout.activity_splash); //Bmob SDK初始化--只需要这一段代码即可完成初始化 //请到Bmob官网(http://www.bmob. ...
- 安卓---app自动更新
主要参考:http://blog.csdn.net/jdsjlzx/article/details/46356013/ 效果如下: 大致思路:[原文] 首先,我们要有一个可以被手机访问的后台. 这里有 ...
- App自动更新(DownloadManager下载器)
一.开门见山 代码: object AppUpdateManager { const val APP_UPDATE_APK = "update.apk" private var b ...
- 解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
转自cocoachina iOS 7能在后台自动app,这对开发者来说和用户都很方便,但是还是有一些缺点.用户不会知道app本次更新的内容,除非他们上到app的App Store页面去查看.开发者也会 ...
随机推荐
- Why does typeof array with objects return “Object” and not “Array”?
https://stackoverflow.com/questions/4775722/check-if-object-is-an-array One of the weird behaviour a ...
- 【bzoj5085】最大(二分+乱搞)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5085 这道题我们可以先二分答案,然后转化为判定是否有四角权值>=mid的矩形. ...
- input ajax自动补全
页面 <div class="manage-Car-add-info-sn"> <p style="width:25%; height:70%;floa ...
- Apache Phoenix的Array类型
Apache Phoenix支持JDBC ARRAY类型,任何原生的数据类型就可以在ARRAY中使用.下面我介绍一下在创建的表中使用ARRAY类型. 先看一下创建表的SQL语句: CREATE TAB ...
- javascript 内置对象及常见API
javascript 内置对象及常见API 2012-09-02 15:17 571人阅读 评论(0) 收藏 举报 javascript正则表达式文档浏览器urlstring Javascript内置 ...
- hadoop环境搭建(linux单机版)
一.在Ubuntu下创建hadoop用户组合hadoop用户 1.创建hadoop用户组 addgroup hadoop 2.创建hadoop用户 adduser -ingroup ...
- C++初始化小问题
#include<; } 发现,没有对string进行初始化,就已经默认可以使用,并且是空串,一直用java,对c++不熟悉.搜索了下,发现在c++中,只要对对象进行了定义,如果没有初始化,就会 ...
- 关于设置UITableView的背景图片
在UITableViewController中,要设置UITableView的背景图片,以前常用的方法是使用backgroundcolor属性,这个属性可以通过UIImage来获取,但最近发现这个方法 ...
- angularjs 简单指令
<!DOCTYPE html> <html data-ng-app="app"> <head> <title>angular js& ...
- Nat123域名设置使用
可以设自己的域名映射到内网ip: http://www.nat123.com/Pages_18_294.jsp 暂时还没学习使用,先保存一下