Android 在线升级
1、获取当前安装版本
//获取当前版本
public int getVersion(Context context){
int version = ;
try {
version = context.getPackageManager().getPackageInfo(
"项目包名", ).versionCode;
} catch (Exception e) {
System.out.println("获取版本号出错");
}
return version;
}
//获取当前版本名称
public String getVersionName(Context context){
String versionName = null;
try {
versionName = context.getPackageManager().getPackageInfo(
"项目包名", ).versionName;
} catch (Exception e) {
System.out.println("获取版本名称出错");
}
return versionName;
}
2、检测服务器发布版本,创建一个ver.aspx 页面
[{"appname":"appName","apkname":"UpdateApp.apk","versionName":"2.0","version":""}]
3、检测服务器发布版本
public String getServerVersion(){
String serverJson = null;
byte[] buffer = new byte[];
try {
URL serverURL = new URL(http_url+"/ver.aspx");
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
int n = ;
while((n = bis.read(buffer))!= -){
serverJson = new String(buffer);
}
} catch (Exception e) {
System.out.println("获取服务器版本出错:"+e);
}
return serverJson;
}
4、版本对比
public boolean compareVersion(Context context){
final Context contextTemp = context;
new Thread(){
public void run() {
Looper.prepare();
String serverJson = manager.getServerVersion();
//读取json
try {
JSONArray array = new JSONArray(serverJson);
JSONObject object = array.getJSONObject();
String getServerVersion = object.getString("version");
String getServerVersionName = object.getString("versionName");
SettingPage.serverVersion = Integer.parseInt(getServerVersion);
SettingPage.serverVersionName = getServerVersionName;
if(SettingPage.version < SettingPage.serverVersion){
// AlertDialog.Builder builder = new Builder(contextTemp);
AlertDialog.Builder builder = new AlertDialog.Builder(contextTemp,R.style.Dialog);//使用浅色背景 主题
builder.setTitle("版本更新" ) ;
builder.setMessage("本地版本号:"+SettingPage.versionName
+"\n"+"服务器版本号:"+SettingPage.serverVersionName ) ;
builder.setPositiveButton("确认下载",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
//下载apk
new Thread(){
public void run() {
Looper.prepare();
downloadApkFile(contextTemp);
Looper.loop();
};
}.start();
}
});
builder.setNegativeButton("取消", null);
builder.show();
}else{
AlertDialog.Builder builder = new Builder(contextTemp);
builder.setTitle("提示" ) ;
builder.setMessage("当前使用版本为最新版" ) ;
builder.setPositiveButton("确定",null);
builder.show();
}
} catch (JSONException e) {
e.printStackTrace();
System.out.println("下载出错"+e);
}
Looper.loop();
};
}.start();
return false;
}
5、下载服务器版本
public void downloadApkFile(Context context){
String savePath = Environment.getExternalStorageDirectory()+"/UpdateApp.apk";
String serverFilePath = http_url+"/UpdateApp.apk";//"/AndroidUpdateDemo.png";
try {
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
URL serverURL = new URL(serverFilePath);
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
File apkfile = new File(savePath);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));
int fileLength = connect.getContentLength();
int downLength = ;
int progress = ;
int n;
byte[] buffer = new byte[];
while((n=bis.read(buffer, , buffer.length))!=-){
bos.write(buffer, , n);
downLength +=n;
progress = (int) (((float) downLength / fileLength) * );
Message msg = new Message();
msg.arg1 = progress;
SettingPage.handler.sendMessage(msg);
}
bis.close();
bos.close();
connect.disconnect();
}
} catch (Exception e) {
System.out.println("下载出错"+e);
}
}
6、下载进度提醒
public class receiveVersionHandler extends Handler {
@Override
public void handleMessage(Message msg) {
proBar.setProgress(msg.arg1);
textView.setText("下载进度:"+msg.arg1+"%"+"\n"+"版本名称:"+versionName);
if(msg.arg1 == ){
Intent intent = new Intent(Intent.ACTION_VIEW);
String path = Environment.getExternalStorageDirectory()+"/UpdateApp.apk";
intent.setDataAndType(Uri.fromFile(new File(path)),
"application/vnd.android.package-archive");
startActivity(intent);
}
//proBar.setVisibility(R.id.button_id_1);
}
}
7、下载完成后手动安装即可
完整升级类代码
public class UpdateManager {
private static UpdateManager manager = null;
private static String http_url="http://127.0.0.1";
private UpdateManager(){}
public static UpdateManager getInstance(){
manager = new UpdateManager();
return manager;
}
//获取当前版本号
public int getVersion(Context context){
int version = ;
try {
version = context.getPackageManager().getPackageInfo(
"项目包名", ).versionCode;
} catch (Exception e) {
System.out.println("获取版本号出错");
}
return version;
}
//获取当前版本名称
public String getVersionName(Context context){
String versionName = null;
try {
versionName = context.getPackageManager().getPackageInfo(
"项目包名", ).versionName;
} catch (Exception e) {
System.out.println("获取版本名称出错");
}
return versionName;
}
//获取服务器发布的版本
public String getServerVersion(){
String serverJson = null;
byte[] buffer = new byte[];
try {
URL serverURL = new URL(http_url+"/ver.aspx");
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
int n = ;
while((n = bis.read(buffer))!= -){
serverJson = new String(buffer);
}
} catch (Exception e) {
System.out.println("获取服务器版本出错:"+e);
}
return serverJson;
}
//版本比较
public boolean compareVersion(Context context){
final Context contextTemp = context;
new Thread(){
public void run() {
Looper.prepare();
String serverJson = manager.getServerVersion();
//读取json
try {
JSONArray array = new JSONArray(serverJson);
JSONObject object = array.getJSONObject();
String getServerVersion = object.getString("version");
String getServerVersionName = object.getString("versionName");
SettingPage.serverVersion = Integer.parseInt(getServerVersion);
SettingPage.serverVersionName = getServerVersionName;
if(SettingPage.version < SettingPage.serverVersion){
// AlertDialog.Builder builder = new Builder(contextTemp);
AlertDialog.Builder builder = new AlertDialog.Builder(contextTemp,R.style.Dialog);//使用浅色背景 主题
builder.setTitle("版本更新" ) ;
builder.setMessage("本地版本号:"+SettingPage.versionName
+"\n"+"服务器版本号:"+SettingPage.serverVersionName ) ;
builder.setPositiveButton("确认下载",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
//下载apk
new Thread(){
public void run() {
Looper.prepare();
downloadApkFile(contextTemp);
Looper.loop();
};
}.start();
}
});
builder.setNegativeButton("取消", null);
builder.show();
}else{
AlertDialog.Builder builder = new Builder(contextTemp);
builder.setTitle("提示" ) ;
builder.setMessage("当前使用版本为最新版" ) ;
builder.setPositiveButton("确定",null);
builder.show();
}
} catch (JSONException e) {
e.printStackTrace();
System.out.println("下载出错"+e);
}
Looper.loop();
};
}.start();
return false;
}
//下载apk
public void downloadApkFile(Context context){
String savePath = Environment.getExternalStorageDirectory()+"/UpdateApp.apk";
String serverFilePath = http_url+"/UpdateApp.apk";//"/AndroidUpdateDemo.png";
try {
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
URL serverURL = new URL(serverFilePath);
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
File apkfile = new File(savePath);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));
int fileLength = connect.getContentLength();
int downLength = ;
int progress = ;
int n;
byte[] buffer = new byte[];
while((n=bis.read(buffer, , buffer.length))!=-){
bos.write(buffer, , n);
downLength +=n;
progress = (int) (((float) downLength / fileLength) * );
Message msg = new Message();
msg.arg1 = progress;
SettingPage.handler.sendMessage(msg);
}
bis.close();
bos.close();
connect.disconnect();
}
} catch (Exception e) {
System.out.println("下载出错"+e);
}
}
}
同时可以参考下面博客,源码实现不同,实现效果大同小异
http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html
Android 在线升级的更多相关文章
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- Android apk在线升级
APK 在线升级 APK 在线升级几乎是所有程序必备的功能. 在线升级功能能解决已有的问题并提供更丰富的新功能. 基本的流程是: 检测到新版本信息 弹出升级提示窗口 点击 No 不进行升级,完毕! 点 ...
- 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...
- 安卓APP在线升级
安卓APP在线升级 通过IDHTTP组件在线下载APP到手机中,然后自动安装这个APP程序. 1)在线下载APP程序 需引用单元: {$IFDEF ANDROID} FMX.Helpers.Andro ...
- 【WCF】基于WCF的在线升级
一.前言 前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...
- dsp 28377在线升级 实例总结
使用dsp品台28377d来实现在线升级的功能. 方案 : 升级程序 + 应用程序 升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳 ...
- 关于DSP的boot mode / boot loader /上电顺序 /在线升级等问题的总结
使用器件 ti dsp c2000 2837x 1.dsp的上电过程和boot mode以及boot loader 1)dsp的上电顺序, 对于双核系统而言 , 他的上电启动顺序如下所示: 系统复位或 ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- 【Remoting】.Net remoting方法实现简单的在线升级(上篇:更新文件)
一.前言: 最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting ...
随机推荐
- Spring Web MVC处理流程
Spring Web MVC 处理流程: 1.浏览器向Spring发出请求,请求交给前端控制器 DispatcherServlet处理 2.控制器通过HandlerMapping找到相应的Contro ...
- 玩转vim编辑器
1.vim 编辑器可以自定义配置:包含初始化命令的文件叫vimrc(h vimrc),version ---查看版本号.系统-用户配置文件所在位置. 2. 可视模式: 操作一块区域代码: 按v ...
- LINQ简记(3):子句
LINQ查询表达式的子句如select,where,from等都是比较简单的子句,相信各位多练习练习,再结合MSDN的例子,基本上是可以理解的,因此,本文只挑几个有代表性的,以及有些难理解的子句来简述 ...
- Python time & random模块
time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的 ...
- 调用ms自带的合成语音TTS
通过import of Component导入封装TTS引擎,然后选择: 最后调用: MyVoce := CoSpVoice.Create; MyVoce.Pause;//暂停 MyVoce.Stat ...
- C/C++ uchar的一个有趣用法
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490 图像处理中常常使用的一种 ...
- R语言 EFA(探索性因子分析)
EFA的目标是通过发掘隐藏在数据下的一组较少的.更为基本的无法观测的变量,来解释一组可观测变量的相关性.这些虚拟的.无法观测的变量称作因子.(每个因子被认为可解释多个观测变量间共有的方差,也叫作公共因 ...
- CSDN处理问题神速,顶你,为你点32个赞!
今天10点左右发表了一篇文章,发表之后.文章状态待审核,博文首页不能显示文章,例如以下图所看到的: 于是果断给官网发了第一封Email.10点19分.CSDN给予回复,内容例如以下: 尊敬的用户您好: ...
- 【树状数组】POJ 2155 Matrix
附一篇经典翻译,学习 树状数组 http://www.hawstein.com/posts/binary-indexed-trees.html /** * @author johnsondu * @ ...
- hdu1285 拓扑排序+优先队列
原题地址 这算是我个人AC的第一个拓扑排序题目吧. 题目解读 给出几组比赛的胜负情况.推断最后的排名.依据题意这就是一个明显的拓扑排序问题了. 注意 假设由于可能的排名有多种情况,这时要保证编号小的在 ...