检查APK版本并更新(服务器和客户端一起来)

一.首先我们思考一下步骤

1,获取当前APK的版本

2,去服务器上获取最新的版本

3,对比后,决定是否更新。

4,更新,去服务器上下载apk.

5.下载后,保存到sd卡,然后安装apk

二,客户端代码如下


package com.zhenshi.updataapk;

import java.io.File;

import com.zhenshi.util.HttpConnect;
import com.zhenshi.util.ToastUtil;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

/**
 * class name:TestUpdataActivity<BR>
 * class description:<BR>
 * PS: <BR>
 * 
 * @version 1.00 2012-4-5
 * @author ZHENSHI)peijiangping
 */
public class TestUpdataActivity extends Activity {
	private String packageName;
	private ProgressDialog pBar;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		yesOrNoUpdataApk();
	}

	/**
	 * Role:是否更新版本<BR>
	 * Date:2012-4-5<BR>
	 * 
	 * @author ZHENSHI)peijiangping
	 */
	private int yesOrNoUpdataApk() {
		packageName = this.getPackageName();
		String nowVersion = getVerCode(TestUpdataActivity.this);
		String newVersion = goToCheckNewVersion();
		if (newVersion.equals("Error")) {
			return 0;
		}
		if (Double.valueOf(newVersion) > Double.valueOf(nowVersion)) {
			doNewVersionUpdate(nowVersion, newVersion);
		}
		return 1;
	}

	/**
	 * Role:是否进行更新提示框<BR>
	 * Date:2012-4-5<BR>
	 * 
	 * @author ZHENSHI)peijiangping
	 */
	private void doNewVersionUpdate(String nowVersion, String newVersion) {
		StringBuffer sb = new StringBuffer();
		sb.append("当前版本:");
		sb.append(nowVersion);
		sb.append(", 发现新版本:");
		sb.append(newVersion);
		sb.append(", 是否更新?");
		Dialog dialog = new AlertDialog.Builder(TestUpdataActivity.this)
				.setTitle("软件更新")
				.setMessage(sb.toString())
				// 设置内容
				.setPositiveButton("更新",// 设置确定按钮
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								pBar = new ProgressDialog(
										TestUpdataActivity.this);
								pBar.setTitle("正在下载");
								pBar.setMessage("请稍候...");
								// pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
								pBar.show();
								goToDownloadApk();
							}
						})
				.setNegativeButton("暂不更新",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int whichButton) {
								// 点击"取消"按钮之后退出程序
								finish();
							}
						}).create();// 创建
		// 显示对话框
		dialog.show();
	}

	/**
	 * Role:开启下载apk的线程<BR>
	 * Date:2012-4-6<BR>
	 * 
	 * @author ZHENSHI)peijiangping
	 */
	private void goToDownloadApk() {
		new Thread(new DownloadApkThread(handler)).start();
	}

	public Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			super.handleMessage(msg);
			if (msg.what == 1) {
				ToastUtil toastUtil = new ToastUtil(TestUpdataActivity.this);
				toastUtil.showDefultToast("下载成功!!").show();
				Intent intent = new Intent(Intent.ACTION_VIEW);
				intent.setDataAndType(
						Uri.fromFile(new File("/sdcard/update/", "updata.apk")),
						"application/vnd.android.package-archive");
				startActivity(intent);
			} else {
				ToastUtil toastUtil = new ToastUtil(TestUpdataActivity.this);
				toastUtil.showDefultToast("下载失败!!").show();
			}
			pBar.cancel();
		}
	};

	/**
	 * Role:去获取当前的应用最新版本<BR>
	 * Date:2012-4-5<BR>
	 * 
	 * @author ZHENSHI)peijiangping
	 */
	private String goToCheckNewVersion() {
		System.out.println("goToCheckNewVersion");
		String newVersion = null;
		final String url = "http://192.168.1.41:8080/TestHttpServlet/GetVersionServlet";
		HttpConnect hc = new HttpConnect(url, this);
		newVersion = hc.getDataAsString(null);
		if (newVersion.equals("Error")) {
			return "Error";
		}
		return newVersion;
	}

	/**
	 * Role:取得程序的当前版本<BR>
	 * Date:2012-4-5<BR>
	 * 
	 * @author ZHENSHI)peijiangping
	 */
	private String getVerCode(Context context) {
		int verCode = 0;
		String verName = null;
		try {
			verCode = context.getPackageManager()
					.getPackageInfo(packageName, 0).versionCode;
			verName = context.getPackageManager()
					.getPackageInfo(packageName, 0).versionName;
		} catch (NameNotFoundException e) {
			System.out.println("no");
		}
		System.out.println("verCode" + verCode + "===" + "verName" + verName);
		return verName;
	}
}

package com.zhenshi.updataapk;

import com.zhenshi.util.HttpDownload;

import android.os.Handler;
import android.os.Message;

/**
 * class name:DownloadApkThread<BR>
 * class description:下载apk的线程<BR>
 * PS: <BR>
 * 
 * @version 1.00 2012-4-5
 * @author ZHENSHI)peijiangping
 */
public class DownloadApkThread implements Runnable {
	private Handler handler;
	private static final String url = "http://192.168.1.41:8080/TestHttpServlet/apk/TestUpdata.apk";
	private static final String fileName = "updata.apk";
	private static final String path = "/sdcard/update";

	public DownloadApkThread(Handler handler) {
		this.handler = handler;
	}

	@Override
	public void run() {
		System.out.println("下载线程开启");
		Message message = new Message();
		message.what = HttpDownload.downLoadFile(url, fileName, path);
		handler.sendMessage(message);
	}
}

package com.zhenshi.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.util.Log;

/**
 * class name:HttpConnect<BR>
 * class description:http请求工具类<BR>
 * PS: <BR>
 * 
 * @version 1.00 2011/09/21
 * @author CODYY)peijiangping
 */
public class HttpConnect {
	/**
	 * 访问的Web服务器地址
	 */
	private String url;
	private HttpPost httpRequest;
	private HttpResponse httpResponse;
	private HttpParams httpParams;
	private HttpClient httpClient;

	public HttpConnect(String url, Context context) {
		this.url = url;
		httpParams = new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(httpParams, 15000);
		HttpConnectionParams.setSoTimeout(httpParams, 15000);
		httpClient = new DefaultHttpClient(httpParams);
	}

	/**
	 * Role:通过Http请求来获取返回值(InputStream) <BR>
	 * Date:2012-2-10 <BR>
	 * 
	 * @author CODYY)peijiangping
	 */
	public InputStream getDataAsInputStream(List<NameValuePair> params) {
		InputStream result = null;
		try {
			httpRequest = new HttpPost(url);
			if (params != null) {
				httpRequest.setEntity(new UrlEncodedFormEntity(params,
						HTTP.UTF_8));
			}
			httpResponse = httpClient.execute(httpRequest);
			if (200 == httpResponse.getStatusLine().getStatusCode()) {
				result = httpResponse.getEntity().getContent();
			}
		} catch (IOException e) {
			Log.e("nimeimei", e.getMessage(), e);
			return result;
		}
		return result;
	}

	/**
	 * Role:通过Http请求来获取返回值(String),异常返回Error<BR>
	 * Date:2012-2-10 <BR>
	 * 
	 * @author CODYY)peijiangping
	 */
	public String getDataAsString(List<NameValuePair> params) {
		String result = null;
		try {
			httpRequest = new HttpPost(url);
			if (params != null) {
				httpRequest.setEntity(new UrlEncodedFormEntity(params,
						HTTP.UTF_8));
			}
			httpResponse = httpClient.execute(httpRequest);
			if (200 == httpResponse.getStatusLine().getStatusCode()) {
				result = EntityUtils.toString(httpResponse.getEntity());
				System.out.println("取得返回值" + result);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return "Error";
		}
		return result;
	}

	/**
	 * Role:通过Http请求来获取返回值(int),失败返回-1,成功返回数据 <BR>
	 * Date:2012-2-10 <BR>
	 * 
	 * @author CODYY)peijiangping
	 */
	public int getDataAsInt(List<NameValuePair> params) {
		int result = -1;
		try {
			httpRequest = new HttpPost(url);
			if (params != null) {
				httpRequest.setEntity(new UrlEncodedFormEntity(params,
						HTTP.UTF_8));
			}
			httpResponse = httpClient.execute(httpRequest);
			if (200 == httpResponse.getStatusLine().getStatusCode()) {
				result = Integer.parseInt(EntityUtils.toString(httpResponse
						.getEntity()));
			}
		} catch (IOException e) {
			return result;
		}
		return result;
	}

	/**
	 * Role:http请求服务器,不取得返回数据,成功返回1<BR>
	 * Date:2012-2-10 <BR>
	 * 
	 * @author CODYY)peijiangping
	 */
	public int sendToService(List<NameValuePair> params) {
		try {
			httpRequest = new HttpPost(url);
			if (params != null) {
				httpRequest.setEntity(new UrlEncodedFormEntity(params,
						HTTP.UTF_8));
			}
			httpResponse = httpClient.execute(httpRequest);
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
		return 1;
	}
}

package com.zhenshi.util;

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

/**
 * 类名:HttpDownload<BR>
 * 作用:下载文件的类<BR>
 * 日期:2012-4-5<BR>
 * 
 * @version V1.0
 * @author peijiangping
 */
public class HttpDownload {
	/**
	 * 功能:下载文件到指定目录下,成功返回1<BR>
	 * 日期:2012-4-5<BR>
	 * 作者:裴江平
	 */
	public static int downLoadFile(String httpUrl, String fileName, String path) {
		FileOutputStream fos = null;
		InputStream is = null;
		HttpURLConnection conn = null;
		// 当存放文件的文件目录不存在的时候创建文件目录
		File tmpFile = new File(path);
		if (!tmpFile.exists()) {
			tmpFile.mkdir();
		}
		// 获取文件对象
		File file = new File(path + "/"+fileName);
		try {
			URL url = new URL(httpUrl);
			try {
				conn = (HttpURLConnection) url.openConnection();
				is = conn.getInputStream();// 获得http请求返回的InputStream对象。
				fos = new FileOutputStream(file);// 获得文件输出流对象来写文件用的
				byte[] buf = new byte[256];
				conn.connect();// http请求服务器
				double count = 0;
				// http请求取得响应的时候
				if (conn.getResponseCode() >= 400) {
					System.out.println("nono");
					return 0;
				} else {
					while (count <= 100) {
						if (is != null) {
							int numRead = is.read(buf);
							if (numRead <= 0) {
								break;
							} else {
								fos.write(buf, 0, numRead);
							}

						} else {
							break;
						}
					}
				}
				conn.disconnect();
				fos.close();
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
				return 0;
			} finally {
				if (conn != null) {
					conn.disconnect();
					conn = null;
				}
				if (fos != null) {
					try {
						fos.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
					fos = null;
				}
				if (is != null) {
					try {
						is.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
					is = null;
				}
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
			return 0;
		}
		return 1;
	}
}

package com.zhenshi.util;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * class name:ToastUtil<BR>
 * class description:显示toast的一个工具类<BR>
 * PS: <BR>
 * 
 * @version 1.00 2011/09/30
 * @author CODYY)peijiangping
 */
public class ToastUtil {
	private Context context;

	public ToastUtil(Context context) {
		this.context = context;
	}

	/**
	 * @param title
	 * @param icon
	 * @return返回一个带图片的toast
	 */
	public Toast showPicToast(String title, Drawable icon) {
		Toast toast = Toast.makeText(context, title, Toast.LENGTH_LONG);
		toast.setGravity(Gravity.CENTER, 0, 0);
		LinearLayout toastView = (LinearLayout) toast.getView();
		ImageView imageCodeProject = new ImageView(context);
		imageCodeProject.setBackgroundDrawable(icon);
		toastView.addView(imageCodeProject, 0);
		return toast;
	}

	/**
	 * @param title
	 * @return返回一个默认的toast
	 */
	public Toast showDefultToast(String title) {
		Toast toast = Toast.makeText(context, title, Toast.LENGTH_SHORT);
		return toast;
	}

	/**
	 * @param layoutid
	 * @return返回一个自定义的toast
	 */
	public Toast showDiyToast(int layoutid) {
		LayoutInflater inflater = LayoutInflater.from(context);
		View myView = inflater.inflate(layoutid,null);
		Toast toast = new Toast(context);
		toast.setGravity(Gravity.RIGHT | Gravity.TOP, 12, 40);
		toast.setDuration(Toast.LENGTH_LONG);
		toast.setView(myView);
		return toast;
	}
}

三,服务器代码如下:

package com.zhenshi.servlet;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zhenshi.util.SerialPortListener;

/**
 * class name:GetVersionServlet<BR>
 * class description:获取最新的软件版本<BR>
 * PS: <BR>
 * 
 * @version 1.00 2012-4-6
 * @author ZHENSHI)peijiangping
 */
public class GetVersionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public Map<String, String> configMap;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public GetVersionServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		configMap = SerialPortListener.configMap;
		String version = configMap.get("version");
		System.out.println(version);
		response.getWriter().write(version);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		/* 接收post请求 */
		doGet(request, response);
	}

}

package com.zhenshi.util;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * class name:SerialPortListener<BR>
 * class description:WEb服务器启动监听类<BR>
 * PS: <BR>
 * Date:2012-2-16<BR>
 * 
 * @version 1.00
 * @author CODYY)peijiangping
 */
public class SerialPortListener implements ServletContextListener {

	public static Map<String, String> configMap;

	public void contextInitialized(ServletContextEvent event) {
		ServletContext context = event.getServletContext();
		String path = context.getRealPath("/");
		path = path.replace("\\", "/");
		path = path.replace("/WebContent", "");
		configMap = findConfig(path);
//		context.setAttribute("configMap", configMap);
	}

	public void contextDestroyed(ServletContextEvent arg0) {

	}

	public Map<String, String> findConfig(String path) {
		Map<String, String> configMap = new HashMap<String, String>();
		FileReader fr = null;
		BufferedReader br = null;
		try {
			fr = new FileReader(path + "conf/config.properties");// 创建FileReader对象,用来读取字符流
			br = new BufferedReader(fr); // 缓冲指定文件的输入
			String myreadline; // 定义一个String类型的变量,用来每次读取一行
			while (br.ready()) {
				myreadline = br.readLine();
				String[] keyAndValue = myreadline.split("=");
				if (keyAndValue.length == 2) {
					configMap.put(keyAndValue[0].trim(), keyAndValue[1].trim());
				} else if (keyAndValue.length > 2) {
					String keyName = myreadline.substring(0,
							myreadline.indexOf("="));
					String keyValue = myreadline.substring(myreadline
							.indexOf("=") + 1);
					configMap.put(keyName.trim(), keyValue.trim());

				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fr != null) {
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return configMap;
	}
}

config.properties内容为:

#config
version=1.0

web.xml内容为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>TestHttpServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <listener>
    <listener-class>com.zhenshi.util.SerialPortListener</listener-class>
  </listener>
  <servlet>
    <description></description>
    <display-name>GetVersionServlet</display-name>
    <servlet-name>GetVersionServlet</servlet-name>
    <servlet-class>com.zhenshi.servlet.GetVersionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetVersionServlet</servlet-name>
    <url-pattern>/GetVersionServlet</url-pattern>
  </servlet-mapping>
</web-app>

服务器为Tomcat.

Androidmainfest.xml记得加上一些应用相关权限。



  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值