您的位置:首页 > 移动开发 > Android开发

关于android客户端在线版本更新的总结(json源码)

2012-03-24 11:39 555 查看
作为新手,对于这个问题,我直接采用的方法就是网上找源码;互联网是个神奇的东西,特别是像android这样开源的语言(不过话说开源开的有点儿过,平台多元化,苦煞了像我这样靠着它吃饭的程序猿),只要你想研究,总能找到有利用价值的解决方案。

废话不多说,版本更新一篇文章说清楚,思路是这样:

1、在android应用每次登录的时候,通过网络访问远程的配置文件(当然版本控制文件可以多种格式,xml、json、甚至txt……依据个人兴趣而定,知道怎么解析就行),确定要不要更新(若版本号改变,那么就更新;版本控制文件由开发者根据版本变化手动修改;我这里采用的json文件写配置)

2、通过解析版本配置文件,将所得版本号与现有应用的版本号进行比对,判断是否需要下载更新;

3、当然版本控制文件可以包含新的apk的URL,新版本特性……附加信息;

4、在提供版本控制文件的同时,还需要服务器安放新版本的apk文件,通过URI指定新版本的apk地址供远程访问下载到本地手机SD卡;

5、这里要非常注意的一个问题:版本更新需要appkey的统一,旧版本和新版本都需要是已签名的apk,否则安装更新无法通过。(前面几步按部就班就行,我在测试的过程中apk文件下载到本地,可就是安装不上,显示“安装为完成”,然后每次都提示安装更新,就是这个问题,甚是无语。由于是独自作战,这个问题竟然困扰了我好几天,加了那么多的android技术群,发了n遍的“拜求贴”,就是没人反馈我,悲痛欲绝,还是从一篇大拿的博客上找到了问题根源:app key)

那篇博文如下:/article/1354113.html

android的客户端更新功能,相信只有做过的才知道其中的辛酸,一要做好断点续传,二要做好数据库的初始化工作,三要做好签名,四要做好版本校验的算法并且能显示动态进度条和百分比。断点续传好做,但是数据库初始化麻烦点,我们的做法是把sqlite库文件直接从raw下拷贝至sd卡中,并设置了sqlite的读取库路径指向它,感觉这样好一点。签名一开始不知道,每次覆盖都提示安装未完成,后来才明白为了保证应用的唯一性,它就像是身份证一样,其他没什么作用,和塞班的签名不是一回事,封装apk必须保证在同一签名文件下才可相互覆盖安装!

json解析方法:

String jsonversion = NetworkTool.getContent(VersionUri);
JSONArray array = new JSONArray(jsonversion);
// 解析Version网页,获取版本号
if (array.length() > 0) {
JSONObject obj = array.getJSONObject(0);
NowVersion = obj.getString("verCode");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

上代码:关键类——UpdateActivity.java

NetworkTool.java

package com.android.Update;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EncodingUtils;

public class NetworkTool {

/**
* 获取网址内容
* @param url
* @return
* @throws Exception
*/
public static String getContent(String url) throws Exception{
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) {
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "GB2312"), 8192);

String line = null;
while ((line = reader.readLine())!= null){
//line = EncodingUtils.getString(line.getBytes("GB2312"), "UTF-8");
sb.append(line + "\n");
}
reader.close();
}
return sb.toString();
}
}


json文件:update.json,放在远程服务器

[{"appname":"Update Client","apkname":"update.apk","apkUrl":"http://open.sina.com.cn/android/update.apk","verCode":"1","verName":"1.0"}]


有了新版本的应用apk,首先上传签名后的apk至指定的服务器地址(如本例:strURL="http://open.sina.com.cn/update.apk"),然后修改json文件的vercode、vername,注意apk和json的一致!

附源码:android在线版本更新源代码http://download.csdn.net/detail/dignity568/4168683
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: