ããä¸ãåå¤
ãã1.æ£æµå½åçæ¬çä¿¡æ¯AndroidManifest.xml-->manifest-->android:versionNameã
ãã2.ä»æå¡å¨è·åçæ¬å·ï¼çæ¬å·åå¨äºxmlæ件ä¸ï¼å¹¶ä¸å½åæ£æµå°ççæ¬è¿è¡å¹é
ï¼å¦æä¸å¹é
ï¼æ示ç¨æ·è¿è¡å级ï¼å¦æå¹é
åè¿å
¥ç¨åºä¸»çé¢ã
ãã3.å½æ示ç¨æ·è¿è¡çæ¬å级æ¶ï¼å¦æç¨æ·ç¹å»äºç¡®å®ï¼ç³»ç»å°èªå¨ä»æå¡å¨ä¸ä¸è½½å¹¶è¿è¡èªå¨å级ï¼å¦æç¹å»åæ¶å°è¿å
¥ç¨åºä¸»çé¢ã
ããäºãææå¾
ã
ããä¸ãå¿
è¦è¯´æ
ããæå¡å¨ç«¯åå¨apkæ件ï¼åæ¶æversion.xmlæ件便äºæ¯å¯¹æ´æ°ã
ãã<?xml version="1.0" encoding="utf-8"?>
ãã<info>
ãã<version>2.0</version>
ãã<url>
http://192.168.1.187:8080/mobilesafe.apk</url>
ãã<description>æ£æµå°ææ°çæ¬ï¼è¯·åæ¶æ´æ°ï¼</description>
ãã<url_server>
http://192.168.1.99/version.xml</url_server>
ãã</info>
ããéè¿ä¸ä¸ªå®ä½ç±»è·åä¸è¿°ä¿¡æ¯ã
ããpackage com.android;
ããpublic class UpdataInfo {
ããprivate String version;
ããprivate String url;
ããprivate String description;
ããprivate String url_server;
ããpublic String getUrl_server() {
ããreturn url_server;
ãã}
ããpublic void setUrl_server(String url_server) {
ããthis.url_server = url_server;
ãã}
ããpublic String getVersion() {
ããreturn version;
ãã}
ããpublic void setVersion(String version) {
ããthis.version = version;
ãã}
ããpublic String getUrl() {
ããreturn url;
ãã}
ããpublic void setUrl(String url) {
ããthis.url = url;
ãã}
ããpublic String getDescription() {
ããreturn description;
ãã}
ããpublic void setDescription(String description) {
ããthis.description = description;
ãã}
ãã}
ããapkåçæ¬ä¿¡æ¯å°åé½æ¾å¨æå¡å¨ç«¯çversion.xmléæ¯è¾æ¹ä¾¿ï¼å½ç¶å¦ææå¡å¨ç«¯ä¸åå¨ï¼apkå°åå¯ä»¥æ¾å¨strings.xmléï¼ä¸è¿çæ¬å·ä¿¡æ¯æ¯æ°çï¼å¿
é¡»æ¾å¨æå¡å¨ç«¯ï¼xmlå°åæ¾å¨strings.xmlã
ãã<?xml version="1.0" encoding="utf-8"?>
ãã<resources>
ãã<string name="hello">Hello World, VersionActivity!</string>
ãã<string name="app_name">Version</string>
ãã<string name="url_server">
http://192.168.1.99/version.xml</string>
ãã</resources>
ããä¸ç¥é读è
åç°æ²¡æï¼ç¬è
ç¯äºä¸ªé误ï¼é£å°±æ¯url_serverå°åå¿
é¡»æ¾å¨æ¬å°ï¼å¦åæä¹è¯»åversion.xmlï¼æ以url_serverä¸å¿
å¨å®ä½ç±»åversionéæ·»å ï¼æ¯ç«æ¯ç°éè¦versionå°åä¹å°±æ¯url_serverï¼æè½å¤è¯»åversionã
ããä¸ã代ç å®ç°
ãã<?xml version="1.0" encoding="utf-8"?>
ãã<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
ããandroid:layout_width="fill_parent"
ããandroid:layout_height="fill_parent"
ããandroid:orientation="vertical" >
ãã<Button
ããandroid:id="@+id/btn_getVersion"
ããandroid:text="æ£æ¥æ´æ°"
ããandroid:layout_width="wrap_content"
ããandroid:layout_height="wrap_content"/>
ãã</LinearLayout>
ããpackage com.android;
ããimport java.io.InputStream;
ããimport org.xmlpull.v1.XmlPullParser;
ããimport android.util.Xml;
ããpublic class UpdataInfoParser {
ããpublic static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
ããXmlPullParser parser = Xml.newPullParser();
ããparser.setInput(is, "utf-8");
ããint type = parser.getEventType();
ããUpdataInfo info = new UpdataInfo();
ããwhile(type != XmlPullParser.END_DOCUMENT ){
ããswitch (type) {
ããcase XmlPullParser.START_TAG:
ããif("version".equals(parser.getName())){
ããinfo.setVersion(parser.nextText());
ãã}else if ("url".equals(parser.getName())){
ããinfo.setUrl(parser.nextText());
ãã}else if ("description".equals(parser.getName())){
ããinfo.setDescription(parser.nextText());
ãã}
ããbreak;
ãã}
ããtype = parser.next();
ãã}
ããreturn info;
ãã}
ãã}
ããpackage com.android;
ããimport java.io.File;
ããimport java.io.InputStream;
ããimport java.net.HttpURLConnection;
ããimport java.net.URL;
ããimport android.app.Activity;
ããimport android.app.AlertDialog;
ããimport android.app.AlertDialog.Builder;
ããimport android.app.ProgressDialog;
ãã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.Bundle;
ããimport android.os.Environment;
ããimport android.os.Handler;
ããimport android.os.Message;
ããimport android.util.Log;
ããimport android.view.View;
ããimport android.view.View.OnClickListener;
ããimport android.widget.Button;
ããimport android.widget.TextView;
ããimport android.widget.Toast;
ããpublic class VersionActivity extends Activity {
ããprivate final String TAG = this.getClass().getName();
ããprivate final int UPDATA_NONEED = 0;
ããprivate final int UPDATA_CLIENT = 1;
ããprivate final int GET_UNDATAINFO_ERROR = 2;
ããprivate final int SDCARD_NOMOUNTED = 3;
ããprivate final int DOWN_ERROR = 4;
ããprivate Button getVersion;
ããprivate UpdataInfo info;
ããprivate String localVersion;
ãã@Override
ããpublic void onCreate(Bundle savedInstanceState) {
ããsuper.onCreate(savedInstanceState);
ããsetContentView(R.layout.main);
ããgetVersion = (Button) findViewById(R.id.btn_getVersion);
ããgetVersion.setOnClickListener(new OnClickListener() {
ãã@Override
ããpublic void onClick(View v) {
ããtry {
ããlocalVersion = getVersionName();
ããCheckVersionTask cv = new CheckVersionTask();
ããnew Thread(cv).start();
ãã} catch (Exception e) {
ãã// TODO Auto-generated catch block
ããe.printStackTrace();
ãã}
ãã}
ãã});
ãã}
ããprivate String getVersionName() throws Exception {
ãã//getPackageName()æ¯ä½ å½åç±»çå
åï¼0代表æ¯è·åçæ¬ä¿¡æ¯
ããPackageManager packageManager = getPackageManager();
ããPackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
ãã0);
ããreturn packInfo.versionName;
ãã}
ããpublic class CheckVersionTask implements Runnable {
ããInputStream is;
ããpublic void run() {
ããtry {
ããString path = getResources().getString(R.string.url_server);
ããURL url = new URL(path);
ããHttpURLConnection conn = (HttpURLConnection) url
ãã.openConnection();
ããconn.setConnectTimeout(5000);
ããconn.setRequestMethod("GET");
ããint responseCode = conn.getResponseCode();
ããif (responseCode == 200) {
ãã// ä»æå¡å¨è·å¾ä¸ä¸ªè¾å
¥æµ
ããis = conn.getInputStream();
ãã}
ããinfo = UpdataInfoParser.getUpdataInfo(is);
ããif (info.getVersion().equals(localVersion)) {
ããLog.i(TAG, "çæ¬å·ç¸å");
ããMessage msg = new Message();
ããmsg.what = UPDATA_NONEED;
ããhandler.sendMessage(msg);
ãã// LoginMain();
ãã} else {
ããLog.i(TAG, "çæ¬å·ä¸ç¸å ");
ããMessage msg = new Message();
ããmsg.what = UPDATA_CLIENT;
ããhandler.sendMessage(msg);
ãã}
ãã} catch (Exception e) {
ããMessage msg = new Message();
ããmsg.what = GET_UNDATAINFO_ERROR;
ããhandler.sendMessage(msg);
ããe.printStackTrace();
ãã}
ãã}
ãã}
ããHandler handler = new Handler() {
ãã@Override
ããpublic void handleMessage(Message msg) {
ãã// TODO Auto-generated method stub
ããsuper.handleMessage(msg);
ããswitch (msg.what) {
ããcase UPDATA_NONEED:
ããToast.makeText(getApplicationContext(), "ä¸éè¦æ´æ°",
ããToast.LENGTH_SHORT).show();
ããcase UPDATA_CLIENT:
ãã//对è¯æ¡éç¥ç¨æ·å级ç¨åº
ããshowUpdataDialog();
ããbreak;
ããcase GET_UNDATAINFO_ERROR:
ãã//æå¡å¨è¶
æ¶
ããToast.makeText(getApplicationContext(), "è·åæå¡å¨æ´æ°ä¿¡æ¯å¤±è´¥", 1).show();
ããbreak;
ããcase DOWN_ERROR:
ãã//ä¸è½½apk失败
ããToast.makeText(getApplicationContext(), "ä¸è½½æ°çæ¬å¤±è´¥", 1).show();
ããbreak;
ãã}
ãã}
ãã};
ãã/*
ãã*
ãã* å¼¹åºå¯¹è¯æ¡éç¥ç¨æ·æ´æ°ç¨åº
ãã*
ãã* å¼¹åºå¯¹è¯æ¡çæ¥éª¤ï¼
ãã* 1.å建alertDialogçbuilder.
ãã* 2.è¦ç»builder设置å±æ§, 对è¯æ¡çå
容,æ ·å¼,æé®
ãã* 3.éè¿builder å建ä¸ä¸ªå¯¹è¯æ¡
ãã* 4.对è¯æ¡show()åºæ¥
ãã*/
ããprotected void showUpdataDialog() {
ããAlertDialog.Builder builer = new Builder(this);
ããbuiler.setTitle("çæ¬å级");
ããbuiler.setMessage(info.getDescription());
ãã//å½ç¹ç¡®å®æé®æ¶ä»æå¡å¨ä¸ä¸è½½ æ°çapk ç¶åå®è£
װ
ããbuiler.setPositiveButton("ç¡®å®", new DialogInterface.OnClickListener() {
ããpublic void onClick(DialogInterface dialog, int which) {
ããLog.i(TAG, "ä¸è½½apk,æ´æ°");
ããdownLoadApk();
ãã}
ãã});
ããbuiler.setNegativeButton("åæ¶", new DialogInterface.OnClickListener() {
ããpublic void onClick(DialogInterface dialog, int which) {
ãã// TODO Auto-generated method stub
ãã//do sth
ãã}
ãã});
ããAlertDialog dialog = builer.create();
ããdialog.show();
ãã}
ãã/*
ãã* ä»æå¡å¨ä¸ä¸è½½APK
ãã*/
ããprotected void downLoadApk() {
ããfinal ProgressDialog pd; //è¿åº¦æ¡å¯¹è¯æ¡
ããpd = new ProgressDialog(this);
ããpd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
ããpd.setMessage("æ£å¨ä¸è½½æ´æ°");
ããpd.show();
ããnew Thread(){
ãã@Override
ããpublic void run() {
ããtry {
ããFile file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
ããsleep(3000);
ããinstallApk(file);
ããpd.dismiss(); //ç»ææè¿åº¦æ¡å¯¹è¯æ¡
ãã} catch (Exception e) {
ããMessage msg = new Message();
ããmsg.what = DOWN_ERROR;
ããhandler.sendMessage(msg);
ãã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");
ããstartActivity(intent);
ãã}
ãã}
ããpackage com.android;
ããimport java.io.BufferedInputStream;
ããimport java.io.File;
ããimport java.io.FileOutputStream;
ããimport java.io.InputStream;
ããimport java.net.HttpURLConnection;
ããimport java.net.URL;
ããimport android.app.ProgressDialog;
ããimport android.os.Environment;
ãã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;
ãã}
ãã}
ãã}
ãã<uses-permission android:name="android.permission.INTERNET"/>
ãã<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>