版本更新

来源:互联网 发布:淘宝不上传身份证清关 编辑:程序博客网 时间:2024/04/29 16:40

获取本地app版本号


PackageManager pkgManager = context.getPackageManager();

PackageInfo info = pkgManager.getPackageInfo(context.getPackageName,0);

String  versionName = info.versionName;

int versionCode = info.versionCode;

eg: int versionCode = context.getPackageManager().getPackageInfo("com.bdyl.activity", 0).versionCode;


安装apk

   Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apkfile),"application/vnd.android.package-archive");


解析version.xml的工具类

<span style="font-size:18px;">package com.bdyl.upgrade;import java.io.InputStream;import java.util.HashMap;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class ParseXmlService {public HashMap<String, String> parseXml(InputStream inStream)throws Exception {HashMap<String, String> hashMap = new HashMap<String, String>();// 实例化一个文档构建器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 通过文档构建器工厂获取一个文档构建器DocumentBuilder builder = factory.newDocumentBuilder();// 通过文档通过文档构建器构建一个文档实例Document document = builder.parse(inStream);// 获取XML文件根节点Element root = document.getDocumentElement();// 获得所有子节点NodeList childNodes = root.getChildNodes();for (int j = 0; j < childNodes.getLength(); j++) {// 遍历子节点Node childNode = (Node) childNodes.item(j);if (childNode.getNodeType() == Node.ELEMENT_NODE) {// Element childElement = (Element) childNode;// 版本号if ("version".equals(childNode.getNodeName())) {hashMap.put("version", childNode.getFirstChild().getNodeValue());}// 软件名称else if (("name".equals(childNode.getNodeName()))) {hashMap.put("name", childNode.getFirstChild().getNodeValue());}// 下载地址else if (("url".equals(childNode.getNodeName()))) {hashMap.put("url", childNode.getFirstChild().getNodeValue());}}}return hashMap;}}</span>


将解析出来的版本号跟本地app版本进行对比,判断是否需要更新下载

<span style="font-size:18px;">package com.bdyl.upgrade;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 java.util.HashMap;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.content.Intent;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.AsyncTask;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.widget.ProgressBar;import android.widget.TextView;import com.bdyl.activity.R;import com.bdyl.constance.Logs;import com.bdyl.utils.ToastUtils;public class UpdateManager {private static final int DOWNLOAD = 1;//下载中 private static final int DOWNLOAD_FINISH = 2;//下载结束private static final int ISUPDATE = 3;//版本不一致HashMap<String, String> mHashMap;//保存解析的XML信息private String mSavePath;//下载保存路径private int progress;//记录进度条数量private boolean cancelUpdate = false;//是否取消更新private Context mContext;/* 更新进度条 */private Dialog mDownloadDialog;private ProgressBar mProgress;private TextView mShowProTxt;private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {// 正在下载case DOWNLOAD:mProgress.setProgress(progress);// 设置进度条位置mShowProTxt.setText(progress+"%");//显示下载进度break;case DOWNLOAD_FINISH:installApk();// 安装文件break;case ISUPDATE:// 版本不一致,弹出更新对话框showNoticeDialog();break;case 4:ToastUtils.show(mContext,mContext.getResources().getString(R.string.soft_update_no));break;}};};public UpdateManager(Context context) {this.mContext = context;}/** * 检测软件更新 */public void checkUpdate() {new Thread(new Runnable() {@Overridepublic void run() {if (isUpdate()) {// 显示提示对话框// showNoticeDialog();mHandler.sendEmptyMessage(3);} else {// ToastUtils.show(mContext,// mContext.getResources().getString(R.string.soft_update_no));// mHandler.sendEmptyMessage(4);}}}).start();}/** * 检查软件是否有更新版本 *  * @return */private boolean isUpdate() {// 获取当前软件版本int versionCode = getVersionCode(mContext);// 从网络获取version.xmlInputStream inStream = null;try {URL url = new URL("http://121.42.192.251:8080/apk/version.xml");HttpURLConnection con = (HttpURLConnection) url.openConnection();con.connect();inStream = con.getInputStream();ParseXmlService service = new ParseXmlService();mHashMap = service.parseXml(inStream);} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (inStream != null) {inStream.close();}} catch (IOException e) {e.printStackTrace();}}// 本地模拟/* * ParseXmlService service = new ParseXmlService(); InputStream inStream * = ParseXmlService.class.getClassLoader() * .getResourceAsStream("version.xml"); try { mHashMap = * service.parseXml(inStream); } catch (Exception e) { * e.printStackTrace(); } finally { try { if (inStream != null) { * inStream.close(); } } catch (IOException e) { e.printStackTrace(); } * } */// 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析if (null != mHashMap) {int serviceCode = Integer.valueOf(mHashMap.get("version"));// 版本判断Logs.v("" + versionCode + "<serviceCode: " + serviceCode);if (serviceCode > versionCode) {return true;}}return false;}/** * 获取软件版本号 *  * @param context * @return */private int getVersionCode(Context context) {int versionCode = 0;try {// 获取软件版本号,对应AndroidManifest.xml下android:versionCodeversionCode = context.getPackageManager().getPackageInfo("com.bdyl.activity", 0).versionCode;} catch (NameNotFoundException e) {e.printStackTrace();}return versionCode;}/** * 显示软件更新对话框 */private void showNoticeDialog() {// 构造对话框AlertDialog.Builder builder = new Builder(mContext);builder.setTitle(R.string.soft_update_title);builder.setMessage(R.string.soft_update_info);// 更新builder.setPositiveButton(R.string.soft_update_updatebtn,new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();// 显示下载对话框showDownloadDialog();}});// 稍后更新builder.setNegativeButton(R.string.soft_update_later,new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});Dialog noticeDialog = builder.create();noticeDialog.show();}/** * 显示软件下载对话框 */private void showDownloadDialog() {// 构造软件下载对话框AlertDialog.Builder builder = new Builder(mContext);builder.setTitle(mContext.getResources().getString(R.string.soft_update_title));// 给下载对话框增加进度条LayoutInflater inflater = LayoutInflater.from(mContext);View v = inflater.inflate(R.layout.dialog_upgrade_layout, null);mProgress = (ProgressBar) v.findViewById(R.id.upgrade_progress);mShowProTxt = (TextView) v.findViewById(R.id.upgrade_showprogress_txt);builder.setView(v);// 取消更新builder.setNegativeButton(R.string.cancel, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();// 设置取消状态cancelUpdate = true;}});mDownloadDialog = builder.create();mDownloadDialog.setCanceledOnTouchOutside(false);mDownloadDialog.show();// 现在文件downloadApk();}/** * 下载apk文件 */private void downloadApk() {// 启动新线程下载软件new downloadApkThread().start();}/** * 下载文件线程 *  */private class downloadApkThread extends Thread {@Overridepublic void run() {try {// 判断SD卡是否存在,并且是否具有读写权限// 获得存储卡的路径if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {mSavePath = Environment.getDownloadCacheDirectory().toString() + "/";} else {mSavePath = Environment.getExternalStorageDirectory().toString() + "/";}URL url = new URL(mHashMap.get("url"));// 创建连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.connect();int length = conn.getContentLength();// 获取文件大小// 创建输入流InputStream is = conn.getInputStream();File apkFile = new File(mSavePath, mHashMap.get("name"));FileOutputStream fos = new FileOutputStream(apkFile, false);// FileOutputStream fos =// mContext.openFileOutput(mHashMap.get("name"),// mContext.MODE_WORLD_WRITEABLE);int count = 0;// 缓存byte buf[] = new byte[1024];// 写入到文件中do {int numread = is.read(buf);count += numread;// 计算进度条位置progress = (int) (((float) count / length) * 100);// 更新进度mHandler.sendEmptyMessage(DOWNLOAD);if (numread <= 0) {Logs.v("over....");// 下载完成mHandler.sendEmptyMessage(DOWNLOAD_FINISH);break;}// 写入文件fos.write(buf, 0, numread);} while (!cancelUpdate);// 点击取消就停止下载.fos.close();is.close();// }} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {}// 取消下载对话框显示mDownloadDialog.dismiss();}};/** * 安装APK文件 */private void installApk() {File apkfile = new File(mSavePath, mHashMap.get("name"));Logs.v("installApk." + apkfile.exists() + apkfile.getAbsolutePath());if (!apkfile.exists()) {return;}// 通过Intent安装APK文件Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(apkfile),"application/vnd.android.package-archive");/* * i.setDataAndType(Uri.parse(apkfile.getAbsolutePath()), * "application/vnd.android.package-archive"); */mContext.startActivity(intent);}}</span>

xml

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical" >    <ProgressBar        android:id="@+id/upgrade_progress"        style="@android:style/Widget.ProgressBar.Horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="@dimen/x10"        android:indeterminate="false"        android:max="100" />    <TextView        android:id="@+id/upgrade_showprogress_txt"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal" /></LinearLayout></span>


     


0 0
原创粉丝点击