您的位置:首页 > 移动开发 > Android开发

【android学习】更新程序

2015-08-20 18:10 411 查看
在程序启动时候基本都会有一个加载页面,在启动页面中我们基本完成下面几件事:

1:显示自己的产品logo

2:应用程序的初始化

3:检查版本更新

4:查看网络连接

下面我们就将完成检查版本更新功能:

一:获得程序版本号,与版本名称。AndroidManifest.xml文件中,可以看到android:versionCode="1"和android:versionName="1.0"两条语句,其中versionCode用于程序更新(给程序员看的),versionName给用户看的

/**
	 * 得到应用程序的版本号
	 */
	private int getVersionCode(){
		// 用来管理手机的APK
		PackageManager pm = getPackageManager();

		try {
			// 得到知道APK的功能清单文件
			PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
			return info.versionCode;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}
	}


versionName用于程序中版本信息显示(给用户看的)

/**
	 * 得到应用程序的版本名称
	 */

	private String getVersionName() {
		// 用来管理手机的APK
		PackageManager pm = getPackageManager();

		try {
			// 得到知道APK的功能清单文件
			PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
			return info.versionName;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}

	}

二:获取服务器中的版本信息。服务器中的版本信息基本上使用两种表现形式

1:json格式的版本信息

{
  "version":"2",
  "directions":"更新版本说明",
  "httpurl":"http://localhost:8080/test.apk"
}
2:xml格式的版本信息

<?xml version="1.0" encoding="utf-8"?>  
<info>  
    <version>2.0</version>  
   <directions>更新版本说明</directions>  
    <httpurl>http://localhost:8080/test.apk</httpurl>  
     
</info>


对于xml的版本格式,需要解析xml,所以在这里就使用json格式的版本更新:

/**
	 * 获得服务器的版本信息
	 * @author zkq
	 *  jsonString就是服务器的json信息
	 */
	class ServerVersionInfo implements Runnable{

		/**
		 * 版本号链接地址
		 */
		String url;
		/**
		 * 从服务器获得的版本信息字符串
		 */
		String jsonString;
		
		public String getJsonString() {
			return jsonString;
		}

		public ServerVersionInfo(String url) {
			this.url = url;
		}
		
		@Override
		public void run() {
			try {
				URL url2 = new URL(url);
				HttpURLConnection conn = (HttpURLConnection) url2.openConnection();//联网
				conn.setConnectTimeout(5000);//设置连接超时
				conn.setRequestMethod("GET");//设置以get请求
				int code = conn.getResponseCode();//获得链接码
				if (code == 200) {//200表示联网成功
					InputStream is = conn.getInputStream();//获得输入流
					jsonString = readFromStream(is);
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		
		}
		/**
		 * 将输入流转换为inputstream
		 * @param is
		 * @return
		 * @throws IOException
		 */
		public String readFromStream(InputStream is) throws IOException{
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024]; 
			int len = 0;
			while ((len = is.read(buffer))!=-1) {
				baos.write(buffer, 0, len);
			}
			is.close();
			String result = baos.toString();
			baos.close();
			return result;
		}
	}


三:上面我们获得了服务器的APK下载地址
http://localhost:8080/test.apk[/code]         我们就可以通过这个地址将文件下载到SD卡,这里我们用到一个开源的下载框架afinal   jar包下载地址

下面的代码,需要在lib文件中加入上面链接下载的afinal.jar文件

在对sdcard读写时候,需要加入权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


/**
	 * 下载文件
	 * uri 下载地址
	 * saveName 保存名字。如:test.apk
	 */
	public void downLoad(String uri,String saveName){
		//判断sdcard是否挂载
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			FinalHttp finalHttp = new FinalHttp();
			/*
			 * 第一个参数:下载链接地址
			 * 第二个参数:保存地址
			 * 第三个参数:毁掉方法
			 */
			finalHttp.download(uri, Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+saveName, new AjaxCallBack<File>() {
				//下载失败
				@Override
				public void onFailure(Throwable t, int errorNo, String strMsg) {
					super.onFailure(t, errorNo, strMsg);
				}
				//下载进度  count为下载文件总长度,current当前下载长度
				@Override
				public void onLoading(long count, long current) {
					super.onLoading(count, current);
				}
				//下载成功 t为下载下来的文件
				@Override
				public void onSuccess(File t) {
					super.onSuccess(t);
					//安装文件
					//installAPK(t);
				}
			
			});
		}
	}

四:下载完成以后,需要安装文件,这时候,调用系统的安装器

/**
	 * 安装APK
	 * @param t
	 */
	private void installAPK(File t) {
	  Intent intent = new Intent();
	  intent.setAction("android.intent.action.VIEW");
	  intent.addCategory("android.intent.category.DEFAULT");
	  intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");
	  startActivity(intent);
	}


好了,到这里更新文件就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: