首页 > 代码库 > Android软件自动更新(自定义处理,不使用第三方)

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  @Override11  public void onCreate(Bundle savedInstanceState)12  {13   super.onCreate(savedInstanceState);14   setContentView(R.layout.main);15   //按钮更新16   Button updateBtn = (Button) findViewById17 (R.id.btnUpdate);18   updateBtn.setOnClickListener(new OnClickListener()19   {20    @Override21    public void onClick(View v)22    {23     UpdateManager manager = new24 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 //解析xml11 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 = DocumentBuilderFactory19     .newInstance();20  21   DocumentBuilder builder = factory22     .newDocumentBuilder();23  24   Document document = builder25     .parse(inStream);26  27   Element root = document28     .getDocumentElement();29  30   NodeList childNodes = root31     .getChildNodes();32   for (int j = 0; j < childNodes33     .getLength(); j++) {34   35    Node childNode = (Node) childNodes36      .item(j);37    if (childNode.getNodeType() ==38 Node.ELEMENT_NODE) {39     Element childElement = (Element)40 childNode;41    42     if ("version"43       .equals(childElement44        45 .getNodeName())) {46      hashMap.put(47        "version",48        childElement49         50 .getFirstChild()51         52 .getNodeValue());53     }54    55     else if (("name"56       .equals(childElement57        58 .getNodeName()))) {59      hashMap.put(60        "name",61        childElement62         63 .getFirstChild()64         65 .getNodeValue());66     }67    68     else if (("url"69       .equals(childElement70        71 .getNodeName()))) {72      hashMap.put(73        "url",74        childElement75         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 block101    e1.printStackTrace();102   }103   HttpURLConnection conn = null;104   try {105    conn = (HttpURLConnection) url106      .openConnection();107   } catch (IOException e1) {108    // TODO Auto-generated catch block109    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 block117    e1.printStackTrace();118   }119  120   ParseXmlService service = new ParseXmlService();121   try {122    mHashMap = service123      .parseXml(is);124   } catch (Exception e) {125    e.printStackTrace();126   }127   if (null != mHashMap) {128    int serviceCode = Integer129      .valueOf(mHashMap130        .get131 ("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 = context146      .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      @Override168      public void onClick(169        DialogInterface170 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      @Override182      public void onClick(183        DialogInterface184 dialog,185        int which) {186       dialog.dismiss();187      }188     });189   Dialog noticeDialog = builder190     .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 = LayoutInflater201     .from(mContext);202   View v = inflater203     .inflate(204      205 R.layout.softupdate_progress,206       null);207   mProgress = (ProgressBar) v208     .findViewById(R.id.update_progress);209   builder.setView(v);210  211   builder.setNegativeButton(212     R.string.soft_update_cancel,213     new OnClickListener() {214      @Override215      public void onClick(216        DialogInterface217 dialog,218        int which) {219       dialog.dismiss();220      221       cancelUpdate = true;222      }223     });224   mDownloadDialog = builder225     .create();226   mDownloadDialog.show();227  228   downloadApk();229  }230  private void downloadApk() {231  232   new downloadApkThread().start();233  }234  private class downloadApkThread235    extends Thread {236   @Override237   public void run() {238    try {239    240     if (Environment241      242 .getExternalStorageState()243       .equals244 (Environment.MEDIA_MOUNTED)) {245     246      String sdpath = Environment247       248 .getExternalStorageDirectory()249        + "/";250      mSavePath = sdpath251        + "download";252      URL url = new URL(253        mHashMap.get254 ("url"));255     256      HttpURLConnection conn =257 (HttpURLConnection) url258       259 .openConnection();260      conn.connect();261     262      int length = conn263       264 .getContentLength();265     266      InputStream is = conn267       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.get278 ("name"));279      FileOutputStream fos = new280 FileOutputStream(281        apkFile);282      int count = 0;283    284      byte buf[] = new byte[1024];285     286      do {287       int numread = is288         .read289 (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       + apkfile335        336 .toString()),337     "application/vnd.android.package-338 archive");339   mContext.startActivity(i);340  }341 }
UpdateManager.java

 

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