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页面去查看.开发者也会 ...
随机推荐
- 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误
标题: 连接到服务器 ------------------------------ 无法连接到 (local). ------------------------------ 其他信息: 在与 SQL ...
- HDU 5884 Sort(2016年青岛网络赛 G 二分+贪心+小优化)
好题 题意:给你n<=100000个数,每个数范围[0,1000],然后给你一个最大的代价T,每次最多合并k个数成为一个数,代价为k个数的总和.问最后合成1个数的总代价不大于T的最小k 题解:我 ...
- tp5 数据库Db增删改操作
添加数据insert $data = [ 'name_cn' => '张三', 'name_en' => 'jack', ]; $res = Db::name('style')->i ...
- 安装rackspace private cloud --4 配置Target hosts
在每个target host上执行以下操作: Naming target hosts. Install the operating system. Generate and set up securi ...
- JavaScript文件下载 兼容所有浏览器 不可跨域
前端文件下载 兼容所有浏览器 download.js文件下载,几乎支持所有类型下载,详细内容参考官网 http://danml.com/download.html 引入文件 <script sr ...
- Unity3d 异常与解决方案集合(持续)
1:更新完unity的5.3.1 版本 后,打开SimpleFrameworld_UGUI 后出现 error CS0117: 'System.IO.Directory' does not conta ...
- hdu3157有源汇上下界最小流
题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题 #include<bits/stdc++.h> #define fi first #define se second #defi ...
- getBytes()详解
在java中,getBytes()方法如果不指定字符集,则得到的是一个操作系统默认的编码格式的字节数组:如果指定字符集,则得到的是在指定字符集下的字节数组,如: byte[] b_gbk = &quo ...
- reloc: Permission denied
群中一个朋友安装EBS是在db 2/5 步骤中遇到如下错误: Checking for errors ... .end std out.sqlplus: error while loading sh ...
- tableau join 与格式问题
一开始我没有找到它的join 方法.其实应该是编辑相应的join关系.选择数据源,选择字段.数据源是可以选择的. 剩下的计算问题,要再弄下.不好说,这个其实烦了我很久了. 高级选项,扩展最大行数.即可 ...