Android软件自动更新(自定义处理,不使用第三方)

来源:http://www.android100.org/html/201406/08/21956.html

XML放入网络空间---version.xml .url地址应该为正常***/*****.apk
<update>
 <version>5</version>
 <name>yuanbao</name>

<url>http://cdn.market.hiapk.com/data/upload//2012/06_27/13/yuanbao.co.

cc_134532.apk
 </url>
</update>

 1 package gognzibai.co.cc;
 2 import android.app.Activity;
 3 import android.os.Bundle;
 4 import android.view.View;
 5 import android.view.View.OnClickListener;
 6 import android.widget.Button;
 7
 8 public class MainActivity extends Activity
 9 {
10  @Override
11  public void onCreate(Bundle savedInstanceState)
12  {
13   super.onCreate(savedInstanceState);
14   setContentView(R.layout.main);
15   //按钮更新
16   Button updateBtn = (Button) findViewById
17 (R.id.btnUpdate);
18   updateBtn.setOnClickListener(new OnClickListener()
19   {
20    @Override
21    public void onClick(View v)
22    {
23     UpdateManager manager = new
24 UpdateManager(MainActivity.this);
25
26     manager.checkUpdate();
27    }
28   });
29
30  }
31 }

MainActivity

 1 package gongzibai.co.cc;
 2 import java.io.InputStream;
 3 import java.util.HashMap;
 4 import javax.xml.parsers.DocumentBuilder;
 5 import javax.xml.parsers.DocumentBuilderFactory;
 6 import org.w3c.dom.Document;
 7 import org.w3c.dom.Element;
 8 import org.w3c.dom.Node;
 9 import org.w3c.dom.NodeList;
10 //解析xml
11 public class ParseXmlService {
12  public HashMap<String, String> parseXml(
13    InputStream inStream)
14    throws Exception {
15   HashMap<String, String> hashMap = new HashMap<String,
16 String>();
17
18   DocumentBuilderFactory factory = DocumentBuilderFactory
19     .newInstance();
20
21   DocumentBuilder builder = factory
22     .newDocumentBuilder();
23
24   Document document = builder
25     .parse(inStream);
26
27   Element root = document
28     .getDocumentElement();
29
30   NodeList childNodes = root
31     .getChildNodes();
32   for (int j = 0; j < childNodes
33     .getLength(); j++) {
34
35    Node childNode = (Node) childNodes
36      .item(j);
37    if (childNode.getNodeType() ==
38 Node.ELEMENT_NODE) {
39     Element childElement = (Element)
40 childNode;
41
42     if ("version"
43       .equals(childElement
44
45 .getNodeName())) {
46      hashMap.put(
47        "version",
48        childElement
49
50 .getFirstChild()
51
52 .getNodeValue());
53     }
54
55     else if (("name"
56       .equals(childElement
57
58 .getNodeName()))) {
59      hashMap.put(
60        "name",
61        childElement
62
63 .getFirstChild()
64
65 .getNodeValue());
66     }
67
68     else if (("url"
69       .equals(childElement
70
71 .getNodeName()))) {
72      hashMap.put(
73        "url",
74        childElement
75
76 .getFirstChild()
77
78 .getNodeValue());
79     }
80    }
81   }
82   return hashMap;
83  }
84 }

ParseXmlService.java

  1 package gongzibai.co.cc;
  2 import java.io.File;
  3 import java.io.FileOutputStream;
  4 import java.io.IOException;
  5 import java.io.InputStream;
  6 import java.net.HttpURLConnection;
  7 import java.net.MalformedURLException;
  8 import java.net.URL;
  9 import java.util.HashMap;
 10 import android.app.AlertDialog;
 11 import android.app.Dialog;
 12 import android.app.AlertDialog.Builder;
 13 import android.content.Context;
 14 import android.content.DialogInterface;
 15 import android.content.Intent;
 16 import android.content.DialogInterface.OnClickListener;
 17 import android.content.pm.PackageManager.NameNotFoundException;
 18 import android.net.Uri;
 19 import android.os.Environment;
 20 import android.os.Handler;
 21 import android.os.Message;
 22 import android.view.LayoutInflater;
 23 import android.view.View;
 24 import android.widget.ProgressBar;
 25 import android.widget.Toast;
 26
 27 public class UpdateManager {
 28
 29  private static final int DOWNLOAD = 1;
 30
 31  private static final int DOWNLOAD_FINISH = 2;
 32
 33  HashMap<String, String> mHashMap;
 34
 35  private String mSavePath;
 36
 37  private int progress;
 38
 39  private boolean cancelUpdate = false;
 40  private Context mContext;
 41
 42  private ProgressBar mProgress;
 43  private Dialog mDownloadDialog;
 44  private Handler mHandler = new Handler() {
 45   public void handleMessage(
 46     Message msg) {
 47    switch (msg.what) {
 48
 49    case DOWNLOAD:
 50
 51     mProgress
 52       .setProgress(progress);
 53     break;
 54    case DOWNLOAD_FINISH:
 55     //安装APK
 56     installApk();
 57     break;
 58    default:
 59     break;
 60    }
 61   };
 62  };
 63  public UpdateManager(Context context) {
 64   this.mContext = context;
 65  }
 66  //检查更新
 67  public void checkUpdate() {
 68   if (isUpdate()) {
 69
 70    showNoticeDialog();
 71   } else {
 72    Toast.makeText(
 73      mContext,
 74      R.string.soft_update_no,
 75      Toast.LENGTH_LONG)
 76      .show();
 77   }
 78  }
 79
 80  private boolean isUpdate() {
 81
 82   int versionCode = getVersionCode(mContext);
 83
 84   //本地的XML更新
 85   // InputStream inStream = ParseXmlService.class
 86   //
 87   // .getResourceAsStream("version.xml");
 88   // InputStream inStream = ParseXmlService.class
 89   // .getClassLoader()
 90   // .getResourceAsStream(
 91   // "version1.xml");
 92
 93   //解析网络xml进行更新软件
 94   URL url = null;
 95   try {
 96    url = new URL(
 97
 98 "http://gongzibai.h001.sjsdidc.cn/version.xml");
 99   } catch (MalformedURLException e1) {
100    // TODO Auto-generated catch block
101    e1.printStackTrace();
102   }
103   HttpURLConnection conn = null;
104   try {
105    conn = (HttpURLConnection) url
106      .openConnection();
107   } catch (IOException e1) {
108    // TODO Auto-generated catch block
109    e1.printStackTrace();
110   }
111   conn.setConnectTimeout(5000);
112   InputStream is = null;
113   try {
114    is = conn.getInputStream();
115   } catch (IOException e1) {
116    // TODO Auto-generated catch block
117    e1.printStackTrace();
118   }
119
120   ParseXmlService service = new ParseXmlService();
121   try {
122    mHashMap = service
123      .parseXml(is);
124   } catch (Exception e) {
125    e.printStackTrace();
126   }
127   if (null != mHashMap) {
128    int serviceCode = Integer
129      .valueOf(mHashMap
130        .get
131 ("version"));
132
133    if (serviceCode > versionCode) {
134     return true;
135    }
136   }
137   return false;
138  }
139
140  private int getVersionCode(
141    Context context) {
142   int versionCode = 0;
143   try {
144
145    versionCode = context
146      .getPackageManager()
147      .getPackageInfo(
148
149 "gongzibai.co.cc",
150        0).versionCode;
151   } catch (NameNotFoundException e) {
152    e.printStackTrace();
153   }
154   return versionCode;
155  }
156
157  private void showNoticeDialog() {
158
159   AlertDialog.Builder builder = new Builder(
160     mContext);
161   builder.setTitle(R.string.soft_update_title);
162   builder.setMessage(R.string.soft_update_info);
163
164   builder.setPositiveButton(
165     R.string.soft_update_updatebtn,
166     new OnClickListener() {
167      @Override
168      public void onClick(
169        DialogInterface
170 dialog,
171        int which) {
172       dialog.dismiss();
173
174       showDownloadDialog();
175      }
176     });
177
178   builder.setNegativeButton(
179     R.string.soft_update_later,
180     new OnClickListener() {
181      @Override
182      public void onClick(
183        DialogInterface
184 dialog,
185        int which) {
186       dialog.dismiss();
187      }
188     });
189   Dialog noticeDialog = builder
190     .create();
191   noticeDialog.show();
192  }
193
194  private void showDownloadDialog() {
195
196   AlertDialog.Builder builder = new Builder(
197     mContext);
198   builder.setTitle(R.string.soft_updating);
199
200   final LayoutInflater inflater = LayoutInflater
201     .from(mContext);
202   View v = inflater
203     .inflate(
204
205 R.layout.softupdate_progress,
206       null);
207   mProgress = (ProgressBar) v
208     .findViewById(R.id.update_progress);
209   builder.setView(v);
210
211   builder.setNegativeButton(
212     R.string.soft_update_cancel,
213     new OnClickListener() {
214      @Override
215      public void onClick(
216        DialogInterface
217 dialog,
218        int which) {
219       dialog.dismiss();
220
221       cancelUpdate = true;
222      }
223     });
224   mDownloadDialog = builder
225     .create();
226   mDownloadDialog.show();
227
228   downloadApk();
229  }
230  private void downloadApk() {
231
232   new downloadApkThread().start();
233  }
234  private class downloadApkThread
235    extends Thread {
236   @Override
237   public void run() {
238    try {
239
240     if (Environment
241
242 .getExternalStorageState()
243       .equals
244 (Environment.MEDIA_MOUNTED)) {
245
246      String sdpath = Environment
247
248 .getExternalStorageDirectory()
249        + "/";
250      mSavePath = sdpath
251        + "download";
252      URL url = new URL(
253        mHashMap.get
254 ("url"));
255
256      HttpURLConnection conn =
257 (HttpURLConnection) url
258
259 .openConnection();
260      conn.connect();
261
262      int length = conn
263
264 .getContentLength();
265
266      InputStream is = conn
267
268 .getInputStream();
269      File file = new File(
270        mSavePath);
271
272      if (!file.exists()) {
273       file.mkdir();
274      }
275      File apkFile = new File(
276        mSavePath,
277        mHashMap.get
278 ("name"));
279      FileOutputStream fos = new
280 FileOutputStream(
281        apkFile);
282      int count = 0;
283
284      byte buf[] = new byte[1024];
285
286      do {
287       int numread = is
288         .read
289 (buf);
290       count += numread;
291
292       progress = (int)
293 (((float) count / length) * 100);
294
295
296 mHandler.sendEmptyMessage(DOWNLOAD);
297       if (numread <= 0) {
298
299
300 mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
301        break;
302       }
303
304       fos.write(buf,
305         0,
306
307 numread);
308      } while (!cancelUpdate);
309      fos.close();
310      is.close();
311     }
312    } catch (MalformedURLException e) {
313     e.printStackTrace();
314    } catch (IOException e) {
315     e.printStackTrace();
316    }
317
318    mDownloadDialog.dismiss();
319   }
320  };
321
322  private void installApk() {
323   File apkfile = new File(
324     mSavePath,
325     mHashMap.get("name"));
326   if (!apkfile.exists()) {
327    return;
328   }
329
330   Intent i = new Intent(
331     Intent.ACTION_VIEW);
332   i.setDataAndType(
333     Uri.parse("file://"
334       + apkfile
335
336 .toString()),
337     "application/vnd.android.package-
338 archive");
339   mContext.startActivity(i);
340  }
341 }

UpdateManager.java

时间: 2024-08-06 07:55:43

Android软件自动更新(自定义处理,不使用第三方)的相关文章

Android - 软件自动更新的实现(转)

在客户端实现更新操作 涉及到三个技术: 1.xml文件的解析 2.HttpURLConnection连接 3.文件流I/O 这里创建一个解析xml文件的服务类:ParXmlService.java [java] view plaincopy package com.xiaowu.news.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; i

Android - 软件自动更新的实现

转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的apk.这样做,如果是在一两个应用平台发布应用,那还说得过去,工作量还不是很大.但大家都知道,Android开发者是比较苦逼的.由于开源所致,出现了N多应用市场.如果想赚取更多的收入,那就要在各个应用市场进行更新.那就悲催咯. 比较出名的一些应用市场有如下: 那如何实现软件自动更新,下面是具体实例:

android软件自动更新的实现步骤

本篇文章是直接下载最新的APK安装的方法,并不是增量下载该APk. 转载请注明出处:http://blog.csdn.net/harryweasley/article/details/44955719,谢谢 想要实现一个android应用,自动更新下载APK软件的方法,我采取的是以下几步方法: 1.每次进入主界面时,获取服务器的数据,看是否是最新版本,是,则无操作,否,则进行以下步骤: 2.弹出是否更新软件的对话框,点击下载后 3.弹出下载的进度条的对话框,开始下载,可以上随时点击按钮,停止下载

Android数据自动更新库DataAutoRefresh

很多android应用,比如音乐播放器.视频播放器.小说阅读器或者其它需要获取本地磁盘指定数据格式数据列表的应用,在磁盘数据有变化(新增或者删除,比如下载完成,拔TF卡.换TF卡)时,需要自动更新数据列表.很多android应用都是需要用户手动去刷新才会更新列表,通过DataAutoRefresh可以实现自动更新. 工程和Demo放在GitHub上了,工程在实际使用中需要不断改进,DataAutoRefresh下载地址 Android数据自动更新库DataAutoRefresh

延缓或阻止Windows 10软件自动更新教程

Windows10强制自动更新机制从"诞生"之际就褒贬不一,强制更新之后从一定程度上提高了系统的安全性,然而它同时也会给用户带来许多不可预料的麻烦,比如说前一段时间的无限重启.那么我们能不能阻止软件自动更新呢?答案当然是肯定的.  如果你使用的是Win10专业版,可以通过设置来推迟升级,具体操作方法如下:  打开开始菜单,然后依次打开"设置"--"更新和安全",然后点击"高级选项",选择"推迟升级"即可. 

Android应用自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息: <update> <version>2</version> <name>baidu

Android 应用自动更新功能的代码

由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息: <update> <version>2</version> <name>baidu

Android应用自动更新功能的实现!!!

自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉. 为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了.步骤分别如下: 第一步:新建一个Android工程命名为:UpdateDemo.代码结构如下图所示: 第二步:新建一个UpdateMana

[转]Android应用自动更新功能的代码实现

本文转自:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html 由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软