No 99 · 【android】apk在线升级

 现在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 exception
			Log.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 exception
			Log.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="";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.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() {
							@Override
							public 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() {
							@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);
    }
}


 

你可能感兴趣的:(android,exception,String,server,File,dialog)