版本更新

首先是UpdateHelper类,检测版本是否要更新


package com.caojing.about;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.content.Context;
import android.content.DialogInterface;

public class UpdateHelper {

	private Context context;

	public UpdateHelper(Context context){
		this.context = context;
	}
	
	private boolean checkVersion(String version){
		Pattern pattern = Pattern.compile("[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}");
		Matcher matcher = pattern.matcher(version);
		if(matcher.find())
			return true;
		return false;
	}
	
	/**
	 * 根据服务器版本号和客户端版本号检查是否需要弹出更新提示框,
	 * 请在执行本类的update之前进行判断,方便后续进入的方法
	 * @param serverVersion	当前服务器版本号
	 * @param clientVersion	当前客户端版本号
	 * @return boolean	是否需要提示升级
	 */
	public boolean checkUpdate(String serverVersion, String clientVersion){
		if(checkVersion(serverVersion)&&checkVersion(clientVersion))
			if(parseVersion(serverVersion)>parseVersion(clientVersion))
				return true;
		return false;
	}
	
	/**
	 * 根据downloadUrl下载更新包,并且更新程序,在调用本方法前请先检查是否需要下载
	 * @param downloadUrl	下载更新包的url,此url必须能正常访问到
	 * @param savePath	升级下载的更新包存放的地址,需要完整路径
	 * @param onCancelListener	弹出对话框后点击不升级的响应事件
	 * @param updateflag 0为提醒更新,1为强制更新
	 */
	public void update(final String downloadUrl, final String savePath, DialogInterface.OnClickListener onCancelListener,final String updateflag){
		CustomDialog.getInst().showUpdateConfirmDialog(context, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				HttpDownloader downloader = new HttpDownloader(context);
				downloader.downloadFile(downloadUrl, savePath, true,updateflag);
			}
		}, onCancelListener);
	}
	
	public void updateMandatory(final String downloadUrl, final String savePath, DialogInterface.OnClickListener onCancelListener,final String updateflag){
        CustomDialog.getInst().showUpdateConfirmDialogMandatory(context, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                HttpDownloader downloader = new HttpDownloader(context);
                downloader.downloadFile(downloadUrl, savePath, true,updateflag);
            }
        },onCancelListener);
    }
	
	private int parseVersion(String version){
		int versionInteger = 0;
		String versionString = "";
		String[] arr = version.split("\\.");
		for(int i = 0; i < arr.length; i++){
			String s = arr[i];
			while(s.length()<4)
				s = "0" + s;
			arr[i] = s;
		}
		for(int i = 0; i < arr.length; i++)
			versionString += arr[i];
		versionInteger = Integer.parseInt(versionString);
		return versionInteger;
	}
	
	
}



接着就是个下载工具类


package com.caojing.about;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;


public class HttpDownloader {

	private URL url = null;
	private String fullFilePath;
	private ProgressDialog downloadDialog;
	private int downloadedSize = 0; // 已下載的文件大小(bit)
	private int fileTotalSize; // 文件的總大小(bit)
	private static final int START_DOWNLOAD = 0x0;
	private static final int DOWNLOADING = 0x1;
	private static final int DOWNLOADED = 0x2;
	private static final int DOWNLOAD_ERROR = -1;
	private static final int PREV_CHECK = 10;
	private Context ctx;
	private File file;
	private String errorMsg;
	private boolean isOpen;
	
	
	private Handler mainThreadHandler = new Handler(Looper.getMainLooper()) {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case PREV_CHECK:{

				break;
			}
			case START_DOWNLOAD: {
				downloadDialog.show();
				downloadDialog.setMax(fileTotalSize);
				break;
			}
			case DOWNLOADING: {
				downloadDialog.setProgress(downloadedSize);
				break;
			}
			case DOWNLOADED: {
				downloadDialog.dismiss();
				Toast.makeText(ctx, "文件下载完成", Toast.LENGTH_SHORT).show();
				if(isOpen){
					OpenFileHelper ofp = new OpenFileHelper(ctx);
					ofp.openFile(file);
				}
				break;
			}
			case DOWNLOAD_ERROR: {
				if(downloadDialog.isShowing())
					downloadDialog.dismiss();
				Toast.makeText(ctx, errorMsg, Toast.LENGTH_SHORT).show();
				if(file!=null)
					FileUtils.delete(file.toString());
				break;
			}
			default:
				break;
			}
			super.handleMessage(msg);
		}

	};
	
	public HttpDownloader(Context ctx){
		this.ctx = ctx;
	}
	
	/**
	 * 该私有方法用于向mainThreadHandler發送消息
	 * 
	 * @param flag
	 */
	private void sendMessage(int flag) {
		Message msg = mainThreadHandler.obtainMessage();
		msg.what = flag;
		mainThreadHandler.sendMessage(msg);
	}
	
	/**
	 * 本方法用于将一个输入流写入到指定文本中
	 * @param file
	 * @param input
	 * @return File
	 */
	private void write2SDFromInput(InputStream input) {
		FileOutputStream output = null;
		Log.i("HttpDownloader", fullFilePath);
		try {
			output = new FileOutputStream(file);
			byte buffer[] = new byte[4 * 1024];
			int size = 0;
			while ((size = input.read(buffer)) != -1) {
				output.write(buffer, 0, size);
				downloadedSize += size;
				sendMessage(DOWNLOADING);
			}
			output.flush();
			sendMessage(DOWNLOADED);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				output.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 启动下载线程
	 * @param urlStr
	 * @param updateflag 0为提醒更新,1为强制更新
	 */
	private void startDownload(final String urlStr,String updateflag){
		downloadDialog = new ProgressDialog(ctx);
		if(updateflag.equals("1")) {
            downloadDialog.setCancelable(false); 
        } else if(updateflag.equals("0")) {
            downloadDialog.setCancelable(true);
        }
		downloadDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		new Thread(new Runnable() {

			@Override
			public void run() {
				InputStream inputStream = null;
				try {
					inputStream = getInputStreamFromUrl(urlStr);
					sendMessage(START_DOWNLOAD);
					write2SDFromInput(inputStream);
				} catch (Exception e) {
					errorMsg = "URL出错,请检查能否正常访问到下载URL";
					sendMessage(DOWNLOAD_ERROR);
					Log.d("HttpDownloader.URL",urlStr);
				} finally {
					try {
						inputStream.close();
					} catch (Exception e) {
						errorMsg = "URL出错,请检查能否正常访问到下载URL";
						sendMessage(DOWNLOAD_ERROR);
						Log.d("HttpDownloader.URL",urlStr);
					}
				}
			}

		}).start();
	}
	
	
	
	/**
	 * 根据URL得到输入流
	 * 
	 * @param urlStr
	 * @return InputStream
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	private InputStream getInputStreamFromUrl(String urlStr)
			throws MalformedURLException, IOException {

		String fName = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr
				.indexOf("?") == -1 ? urlStr.length() : urlStr.indexOf("?"));
		urlStr = urlStr.replace(fName, java.net.URLEncoder.encode(fName));//处理附件名中文问题
		Log.i("HttpDownloader", "urlStr-->" + urlStr);
		url = new URL(urlStr);
		URLConnection urlConn = url.openConnection();
		urlConn.connect();
		InputStream inputStream = urlConn.getInputStream();
		fileTotalSize = urlConn.getContentLength();
		return inputStream;
	}

	
	/**
	 * 根据文件的下载URl,将下载到的文件到SD卡中的指定文件下,
	 * @param url	下载的URL
	 * @param filePath	下载后保存为指定文件的全路径
	 * @param isOpen	下载完是否自动调用应用程序打开
	 * @param updateflag 0为提醒更新,1为强制更新
	 */
	public void downloadFile(String url, String filePath, boolean isOpen,String updateflag){
		
		this.isOpen = isOpen;
		this.fullFilePath = filePath;
		File file = new File(filePath);
//		if(file.exists()){
//			this.file = file;
//			if(isOpen){//文档存在,并且需要打开文档
//				Toast.makeText(ctx, "文件已经存在,系统将自动为您打开", Toast.LENGTH_SHORT).show();
//				OpenFileHelper helper = new OpenFileHelper(ctx);
//				helper.openFile(file);
//			}else{//文档存在,但是不需要打开文档
//				Toast.makeText(ctx, "该文件已经存在...", Toast.LENGTH_SHORT).show();
//			}
//		}else{
			if(file.isDirectory()){
				errorMsg = "存储对象必须是文件,请联系相关开发人员";
				sendMessage(DOWNLOAD_ERROR);
				return;
			}
			if(file.getParent()!=null){
				if(!(new File(file.getParent()).exists())){
					FileUtils.createDir(file.getParent());
				}
			}
			try {
				this.file = FileUtils.createFile(filePath);
			} catch (IOException e) {
				errorMsg = "创建文件失败";
				sendMessage(DOWNLOAD_ERROR);
				return;
			}
			startDownload(url,updateflag);
//		}
	}
	
	public String downloadText(String urlStr){
		StringBuffer sb = new StringBuffer();
		String line = null;
		BufferedReader buffer = null;
		try {
			// 创建一个URL对象
			url = new URL(urlStr);
			// 创建一个Http连接
			HttpURLConnection urlConn = (HttpURLConnection) url
					.openConnection();
			// 使用IO流读取数据
			buffer = new BufferedReader(new InputStreamReader(
					urlConn.getInputStream(),"GBK"));
			while ((line = buffer.readLine()) != null) {
				sb.append(line + "\r\n");
			}
			urlConn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				buffer.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sb.toString();
	}
	
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值