开源中国的版本更新
2016-08-22 19:09
155 查看
//版本更新的工具类 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.xmlpull.v1.XmlPullParser; import com.royalmud.app.application.RoyalMudApplication; import com.royalmud.app.bean.Update; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.util.Xml; /** * 版本更新 */ public class VersionUpdateUtils{ Handler handler = new Handler() { @Override public void handleMessage(Message msg) { String xml = (String) msg.obj; //解析数据 jiexiApkData(xml); } }; private String apkUrl = "http://www.oschina.net/MobileAppVersion.xml"; private Update update; private Context context; /** * 解析apk * * @param xml */ public void jiexiApkData(String xml) { try { XmlPullParser newPullParser = Xml.newPullParser(); ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes()); newPullParser.setInput(bais, "utf-8"); int eventType = newPullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String name = newPullParser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if ("android".equals(name)) { update = new Update(); } else if ("versionCode".equals(name)) { update.setVersionCode(newPullParser.nextText()); } else if ("versionName".equals(name)) { update.setVersionName(newPullParser.nextText()); } else if ("downloadUrl".equals(name)) { update.setDownloadUrl(newPullParser.nextText()); } else if ("updateLog".equals(name)) { update.setUpdateLog(newPullParser.nextText()); } break; } eventType = newPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } // 判断更新 panduanUpdate(); } /** * 请求apk信息 */ public void reguestAPKData(Context context) { this.context=context; new Thread() { @Override public void run() { try { URL url = new URL(apkUrl); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setConnectTimeout(5000); ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } Message message = handler.obtainMessage(); message.obj = baos.toString(); handler.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } }.start(); } /** * 安装apk */ protected void installApk(File file) { Intent intent = new Intent(); // 执行动作 intent.setAction(Intent.ACTION_VIEW); // 执行的数据类型 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); } protected void downLoadApk() { final ProgressDialog pd; // 进度条对话框 pd = new ProgressDialog(context); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("正在下载更新"); pd.show(); // 进行下载操作 new Thread() { @Override public void run() { try { // 下载 File file = DownLoadManager.getFileFromServer( update.getDownloadUrl(), pd); sleep(3000); // 安装 installApk(file); pd.dismiss(); // 结束掉进度条对话框 } catch (Exception e) { } } }.start(); } /** * 提醒更新的对话框 */ private void initAlert() { try { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("软件版本更新"); builder.setMessage(update.getUpdateLog()); builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 点击立即下载更新包 downLoadApk(); } }); builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } catch (Exception e) { e.printStackTrace(); } } /** * 获得本应用的版本信息 */ private void panduanUpdate() { try { PackageManager packageManager = RoyalMudApplication.getContext() .getPackageManager(); PackageInfo packInfo = packageManager.getPackageInfo(RoyalMudApplication .getContext().getPackageName(), 0); String versionName = packInfo.versionName; if (!versionName.equals(update.getVersionName())) { initAlert(); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } } //然后在Mainactivity中实现方法就可以了 /** * 版本更新 */ public void updataVersion() { vutils = new VersionUpdateUtils(); vutils.reguestAPKData(MainActivity.this); } -------------------还要一个工具类DownLoadManager -------------------- import android.app.ProgressDialog; import android.os.Environment; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** 下载apk所用的类 @author ZX50J 管理版本更新 * */ public class DownLoadManager { public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{ //如果相等的话表示当前的sdcard挂载在手机上并且是可用的 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); //获取到文件的大小 pd.setMax(conn.getContentLength()); InputStream is = conn.getInputStream(); File file = new File(Environment.getExternalStorageDirectory(), "updata.apk"); FileOutputStream fos = new FileOutputStream(file); BufferedInputStream bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; int len ; int total=0; while((len =bis.read(buffer))!=-1){ fos.write(buffer, 0, len); total+= len; //获取当前下载量 pd.setProgress(total); } fos.close(); bis.close(); is.close(); return file; } else{ return null; } } } Bena包-----------update----------------------------------------- package com.test.Bean; /** 版本更新的bean包 Created by Administrator on 2016/7/1. */ public class Update { private String versionCode; private String versionName; private String downloadUrl; private String updateLog; public String getVersionCode() { return versionCode; } public void setVersionCode(String versionCode) { this.versionCode = versionCode; } public String getVersionName() { return versionName; } public void setVersionName(String versionName) { this.versionName = versionName; } public String getDownloadUrl() { return downloadUrl; } public void setDownloadUrl(String downloadUrl) { this.downloadUrl = downloadUrl; } public String getUpdateLog() { return updateLog; } public void setUpdateLog(String updateLog) { this.updateLog = updateLog; } }
相关文章推荐
- Farseer.net轻量级开源框架 版本更新及下载
- 微软已将WinJS开源项目更新至3.0版本
- 开源项目:版本更新
- 2006“IBM杯”中国高校SOA应用大赛禁止使用任何版本的GPL/LGPL license的开源软件
- 社交开源系统ThinkSNS V4.6.4更新,版本更新提示功能上线
- 社交开源系统ThinkSNS V4.6.4更新,版本更新提示功能上线
- 【从0开始Tornado建站】0.9版本python网站代码开源--持续更新中
- 开源中国源码解析之检测更新
- EntboostIM更新1.4.3版本, 安卓开源手机 IM, 企业IM
- rainbond 开源版更新 3.4.1 版本
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- wemall微信开源商城版本更新
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- 使用清华大学开源软件镜像AOSP的“每月更新初始化包”更新指定版本的Android源码
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- Sharetronix 开源微博客系统版本更新至1.4.1