android更新应用程序

直接贴代码:

config类:

package com.tutor.config;

import org.json.JSONArray;
import org.json.JSONObject;
import com.tutor.update.R;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;

public class Config
{

	public String UPDATE_SERVER = "http://10.81.48.181:8080/update/";

	public String UPDATE_APKNAME = "";

	public String UPDATE_SAVENAME = "update.apk";

	public String UPDATE_VERJSON = "ver.json";

	public static int newVerCode;

	public static String newVerName;

	/**
	 * 获取当前版本号
	 * 
	 * @param context
	 * @return
	 */
	public int getVerCode(Context context)
	{
		int verCode = -1;
		try
		{
			// 获取packagemanager的实例
			PackageManager packageManager = context.getPackageManager();
			// getPackageName()是你当前类的包名,0代表是获取版本信息
			PackageInfo packInfo =
					packageManager.getPackageInfo(context.getPackageName(), 0);
			verCode = packInfo.versionCode;
			// verCode =
			// context.getPackageManager().getPackageInfo(
			// "com.example.update", 0).versionCode;
			System.out.println("nowcode---?>>>" + verCode);
		}
		catch (NameNotFoundException e)
		{
			Log.e("RG", e.getMessage());
		}
		return verCode;
	}

	/**
	 * 获取版本名称
	 * 
	 * @param context
	 * @return
	 */
	public String getVerName(Context context)
	{
		String verName = "";

		try
		{
			// 获取packagemanager的实例
			PackageManager packageManager = context.getPackageManager();
			// getPackageName()是你当前类的包名,0代表是获取版本信息
			PackageInfo packInfo =
					packageManager.getPackageInfo(context.getPackageName(), 0);
			verName = packInfo.versionName;
			// verName =
			// context.getPackageManager().getPackageInfo(
			// "com.example.update", 0).versionName;
		}
		catch (NameNotFoundException e)
		{
			Log.e("RG", e.getMessage());
		}
		return verName;
	}

	// public static String getVerName(Context context)
	// {
	// String verName =
	// context.getResources().getText(R.string.app_versionName)
	// .toString();
	// return verName;
	// }
	public static String getAppName(Context context)
	{
		String verName =
				context.getResources().getText(R.string.app_name).toString();
		return verName;
	}

	/**
	 * 检查服务器的版本
	 * 
	 * @return
	 */
	public boolean getServerVerCode()
	{
		try
		{
			String verjson =
					NetworkTool.getContent(UPDATE_SERVER + UPDATE_VERJSON);
			System.out.println("verjson--->>>" + 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");
					System.out.println("newVerCode--->>>" + newVerCode);
					System.out.println("newVerName--->>>" + newVerName);
				}
				catch (Exception e)
				{
					newVerCode = -1;
					newVerName = "";
					return false;
				}
			}
		}
		catch (Exception e)
		{
			Log.e("RG", e.getMessage());
			return false;
		}
		return true;
	}
}
NetworkTool类:

package com.tutor.config;

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

public class NetworkTool
{

	public static String getContent(String filename)
	{
		URL url;
		String str;
		try
		{
			url = new URL(filename);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.connect();
			int len = conn.getContentLength();
			InputStream is = conn.getInputStream();
			byte[] by = new byte[len];
			is.read(by);
			str = new String(by, "UTF-8");
			return str;
		}
		catch (MalformedURLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
	}
}
UpdateApplication类:

package com.tutor.config;


import android.content.Context;

public class UpdateApplication
{

	/**
	 * 检查更新状态
	 * 
	 * @param context
	 * @return
	 */
	public static boolean getUpdateInfo(Context context)
	{

		Config cof = new Config();
		cof.getServerVerCode();
		if (cof.getVerCode(context) < Config.newVerCode)
		{
			return true;
		}
		else
		{
			return false;
		}

	}

	/**
	 * 马上更新
	 * 
	 * @param context
	 */
	public static void newUpdate(Context context)
	{
		UpdateManager mUpdateManager = new UpdateManager(context);
		mUpdateManager.checkUpdateInfo();
	}
}
UpdateManager类:

package com.tutor.config;

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;

import com.tutor.update.R;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;

public class UpdateManager
{

	private Context mContext;

	// 提示语
	private String updateMsg = "有最新的软件包哦,亲快下载吧~";

	// 返回的安装包url
	private String apkUrl = "http://10.81.48.181:8080/update/UpdateDemo.apk";

	private Dialog noticeDialog;

	private Dialog downloadDialog;

	/* 下载包安装路径 */
	private static final String savePath = "/sdcard/updatedemo/";

	private static final String saveFileName = savePath
			+ "UpdateDemoRelease.apk";

	/* 进度条与通知ui刷新的handler和msg常量 */
	private ProgressBar mProgress;

	private static final int DOWN_UPDATE = 1;

	private static final int DOWN_OVER = 2;

	private int progress;

	private Thread downLoadThread;

	private boolean interceptFlag = false;

	private Handler mHandler = new Handler()
	{

		public void handleMessage(Message msg)
		{
			switch (msg.what)
			{
			case DOWN_UPDATE:
				mProgress.setProgress(progress);
				break;
			case DOWN_OVER:

				installApk();
				break;
			default:
				break;
			}
		};
	};

	public UpdateManager(Context context)
	{
		this.mContext = context;
	}

	// 外部接口让主Activity调用
	public void checkUpdateInfo()
	{
		showNoticeDialog();
	}

	private void showNoticeDialog()
	{
		AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle("软件版本更新");
		builder.setMessage(updateMsg);
		builder.setPositiveButton("下载", new OnClickListener()
		{

			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
				showDownloadDialog();
			}
		});
		builder.setNegativeButton("以后再说", new OnClickListener()
		{

			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
			}
		});
		noticeDialog = builder.create();
		noticeDialog.show();
	}

	private void showDownloadDialog()
	{
		AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle("软件版本更新");

		final LayoutInflater inflater = LayoutInflater.from(mContext);
		View v = inflater.inflate(R.layout.progress, null);
		mProgress = (ProgressBar) v.findViewById(R.id.progress);

		builder.setView(v);
		builder.setNegativeButton("取消", new OnClickListener()
		{

			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
				interceptFlag = true;
			}
		});
		downloadDialog = builder.create();
		downloadDialog.show();

		downloadApk();
	}

	private Runnable mdownApkRunnable = new Runnable()
	{

		@Override
		public void run()
		{
			try
			{
				URL url = new URL(apkUrl);

				HttpURLConnection conn =
						(HttpURLConnection) url.openConnection();
				conn.connect();
				int length = conn.getContentLength();
				InputStream is = conn.getInputStream();

				File file = new File(savePath);
				if (!file.exists())
				{
					file.mkdir();
				}
				String apkFile = saveFileName;
				File ApkFile = new File(apkFile);
				FileOutputStream fos = new FileOutputStream(ApkFile);

				int count = 0;
				byte buf[] = new byte[24];

				do
				{
					int numread = is.read(buf);
					count += numread;
					progress = (int) (((float) count / length) * 100);
					// 更新进度
					mHandler.sendEmptyMessage(DOWN_UPDATE);
					if (numread <= 0)
					{
						// 下载完成通知安装
						mHandler.sendEmptyMessage(DOWN_OVER);
						break;
					}
					fos.write(buf, 0, numread);
				} while (!interceptFlag);// 点击取消就停止下载.

				fos.close();
				is.close();
			}
			catch (MalformedURLException e)
			{
				e.printStackTrace();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}

		}
	};

	/**
	 * 下载apk
	 * 
	 * @param url
	 */

	private void downloadApk()
	{
		downLoadThread = new Thread(mdownApkRunnable);
		downLoadThread.start();
	}

	/**
	 * 安装apk
	 * 
	 * @param url
	 */
	private void installApk()
	{
		if (downloadDialog.isShowing())
		{
			downloadDialog.dismiss();
		}
		File apkfile = new File(saveFileName);
		if (!apkfile.exists())
		{
			return;
		}
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
				"application/vnd.android.package-archive");
		mContext.startActivity(i);

	}
}
MainAcitivity:

package com.tutor.update;

import com.tutor.config.UpdateApplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainAcitivity extends Activity
{


	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button bt = (Button) findViewById(R.id.button1);
		bt.setOnClickListener(new OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				if (UpdateApplication.getUpdateInfo(MainAcitivity.this))
				{
					UpdateApplication.newUpdate(MainAcitivity.this);
				}
				else
				{
					Toast.makeText(MainAcitivity.this, "程序已经是最新状态!谢谢使用",
							Toast.LENGTH_SHORT).show();
				}

			}
		});
	}
}



你可能感兴趣的:(android开发)