No 99 · 【android】apk在线升级
16lz
2021-01-26
现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持。一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端。当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级。
一、配置文件:
update_version.json
[{"appname":"myapp","apkname":"myapp.apk","verName":1.0,"verCode":1}]
版本的比较,是根据update_version.json中的verCode 以及apk文件中AndroidManifest.xml文件中的定义的版本号:
android:versionCode="1"android:versionName="1.0"
二、初始化时比较版本
//比较服务器版本//在 onCreate函数中调用if (getServerVerCode()) {int vercode = Config.getVerCode(this);if (newVerCode > vercode) {doNewVersionUpdate();//发现新版本更新} else {Toast.makeText(getApplicationContext(),"目前是最新版本,感谢您的支持",Toast.LENGTH_LONG).show();//没有新版本}}//子函数,获取版本号private boolean getServerVerCode() { try { //取得服务器地址和接口文件名 String verjson = NetworkTool.getContent(Config.UPDATE_SERVER + Config.UPDATE_VERJSON); JSONArray array = new JSONArray(verjson); if (array.length() > 0) { JSONObject obj = array.getJSONObject(0); try { newVerCode = Integer.parseInt(obj.getString("verCode")); newVerName = obj.getString("verName"); } catch (Exception e) { newVerCode = -1; newVerName = ""; return false; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } return true;}//子函数,若是有新版本,则private void doNewVersionUpdate() { int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append(", 发现新版本"); sb.append(newVerName); sb.append(" Code:"); sb.append(newVerCode); sb.append(",是否更新?"); Dialog dialog = new AlertDialog.Builder(UpdateActivity.this) .setTitle("软件更新") .setMessage(sb.toString()) // 设置内容 .setPositiveButton("更新",// 设置确定按钮 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pBar = new ProgressDialog(UpdateActivity.this); pBar.setTitle("正在下载"); pBar.setMessage("请稍候..."); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME); } }) .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // 点击"取消"按钮之后退出程序 finish(); } }).create();//创建 // 显示对话框 dialog.show();}
三、下载并升级
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 file = new File(Environment.getExternalStorageDirectory(),Config.UPDATE_SAVENAME);fileOutputStream = new FileOutputStream(file);byte[] buf = new byte[1024];int ch = -1;int count = 0;while ((ch = is.read(buf)) != -1) {fileOutputStream.write(buf, 0, ch);count += ch;if (length > 0) {}}}fileOutputStream.flush();if (fileOutputStream != null) {fileOutputStream.close();}down();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}void down() {handler.post(new Runnable() {public void run() {pBar.cancel();update();}});}void update() {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), Config.UPDATE_SAVENAME)),"application/vnd.android.package-archive");startActivity(intent);}
还有一些细节,没有说出来~
相关文献参考:
http://blog.csdn.net/xjanker2/article/details/6303937
http://blog.csdn.net/muyu114/article/details/6623509
http://blog.csdn.net/w200221626/article/details/6690769
本文转载自:http://www.cnblogs.com/Amandaliu/archive/2011/08/22/2148936.html
Config.java
package Sys.ext;import Sys.activity.R;import android.content.Context;import android.content.pm.PackageManager.NameNotFoundException;import android.util.Log;public class Config {private static final String TAG="Config";public static final String UPDATE_SERVER = "http://10.20.147.117/jtapp12/"; public static final String UPDATE_APKNAME = "jtapp-12-updateapksamples.apk"; public static final String UPDATE_VERJSON = "ver.json"; public static final String UPDATE_SAVENAME = "updateapksamples.apk";/** * get version number * @param context * @return */public static int getVerCode(Context context){int verCode=-1;try {verCode=context.getPackageManager().getPackageInfo("Sys.activity", 0).versionCode;} catch (NameNotFoundException e) {// TODO: handle exceptionLog.e(TAG, e.getMessage());}return verCode;}/** * get version number * @param context * @return */public static String getVerName(Context context){String verName="";try {verName=context.getPackageManager().getPackageInfo("Sys.activity", 0).versionName;} catch (NameNotFoundException e) {// TODO: handle exceptionLog.e(TAG, e.getMessage());}return verName;}/** * get apkname * @param context * @return */public static String getAppName(Context context){String verName=context.getResources().getText(R.string.app_name).toString();return verName;}}
NetworkTool.java
package Sys.ext;import java.io.BufferedReader;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;public class NetworkTool {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) {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();}return sb.toString();}}
UpdateActivity.java
package Sys.activity;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONArray;import org.json.JSONObject;import Sys.ext.Config;import Sys.ext.NetworkTool;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.util.Log;public class UpdateActivity extends Activity{private static final String TAG="Update";public ProgressDialog pBar;private Handler handler=new Handler();private int newVerCode=0;private String newVerName="";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);if (getServerVerCode()) {int vercode=Config.getVerCode(this);if (newVerCode>vercode) {doNewVersionUpdate();}else {notNewVersionShow();}}}private boolean getServerVerCode() { try { String verjson = NetworkTool.getContent(Config.UPDATE_SERVER + Config.UPDATE_VERJSON); JSONArray array = new JSONArray(verjson); if (array.length() > 0) { JSONObject obj = array.getJSONObject(0); try { newVerCode = Integer.parseInt(obj.getString("verCode")); newVerName = obj.getString("verName"); } catch (Exception e) { newVerCode = -1; newVerName = ""; return false; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } return true; }private void notNewVersionShow() {int verCode = Config.getVerCode(this);String verName = Config.getVerName(this);StringBuffer sb = new StringBuffer();sb.append("当前版本:");sb.append(verName);sb.append(" Code:");sb.append(verCode);sb.append(",/n已是最新版,无需更新!");Dialog dialog = new AlertDialog.Builder(UpdateActivity.this).setTitle("软件更新").setMessage(sb.toString())// 设置内容.setPositiveButton("确定",// 设置确定按钮new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {finish();}}).create();// 创建// 显示对话框dialog.show();}private void doNewVersionUpdate() {int verCode = Config.getVerCode(this);String verName = Config.getVerName(this);StringBuffer sb = new StringBuffer();sb.append("当前版本:");sb.append(verName);sb.append(" Code:");sb.append(verCode);sb.append(", 发现新版本:");sb.append(newVerName);sb.append(" Code:");sb.append(newVerCode);sb.append(", 是否更新?");Dialog dialog = new AlertDialog.Builder(UpdateActivity.this).setTitle("软件更新").setMessage(sb.toString())// 设置内容.setPositiveButton("更新",// 设置确定按钮new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {pBar = new ProgressDialog(UpdateActivity.this);pBar.setTitle("正在下载");pBar.setMessage("请稍候...");pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME);}}).setNegativeButton("暂不更新",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {// 点击"取消"按钮之后退出程序finish();}}).create();// 创建// 显示对话框dialog.show();} 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 file = new File( Environment.getExternalStorageDirectory(), Config.UPDATE_SAVENAME); fileOutputStream = new FileOutputStream(file); byte[] buf = new byte[1024]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { fileOutputStream.write(buf, 0, ch); count += ch; if (length > 0) { } } } fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } down(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } void down() { handler.post(new Runnable() { public void run() { pBar.cancel(); update(); } }); } void update() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory(), Config.UPDATE_SAVENAME)), "application/vnd.android.package-archive"); startActivity(intent); }}
更多相关文章
- android G1蓝牙与无线网络,APN接入点设置
- Android(安卓)Studio导入指定的jar包
- . Android內核Porting相關背景知識
- Android(安卓)利用Fiddler进行网络数据抓包
- Android(安卓)自定义控件基础
- Android设置Alpha值实现图片渐变效果
- Android小项目之四 自动更新检查的逻辑
- android 对话框弹出位置和透明度的设置
- Android(安卓)获取应用的安装时间及更新时间