android检测版本更新

原理就是从服务器获取版本号和本得apk的版本号对比更新;

//检查更新
        Activity activity = this;
        while(activity.getParent()!=null){
            activity = activity.getParent();
        }
        new UpdateManager(activity, true).checkUpdate();

下面是UpdateManager.java类:

package com.tzj.update;

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 java.util.Locale;
import java.util.Map;
import org.json.JSONObject;
import com.tzj.uitl.NetUtil;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources.NotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

public class UpdateManager
{
    //下载中...
        private static final int DOWNLOAD = 1;
        //下载完成
        private static final int DOWNLOAD_FINISH = 2;
        //保存解析的XML信息
        Map<String , String> mHashMap;
        //下载保存路径
        private String mSavePath;
        //记录进度条数量
        private int progress;
        //是否取消更新
        private boolean cancelUpdate = false;
        //上下文对象
        private Context mContext;
        //进度条
        private ProgressBar mProgressBar;
        //更新进度条的对话框
        private Dialog mDownloadDialog;
        private boolean isShowDialog;
        private String msg;
        
        private Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch(msg.what){
                //下载中。。。
                case DOWNLOAD:
                    //更新进度条
                    System.out.println(progress);
                    mProgressBar.setProgress(progress);
                    break;
                //下载完成
                case DOWNLOAD_FINISH:
                    // 安装文件
                    installApk();
                    break;
                }
            };
        };

public UpdateManager(Context context, boolean isShowDialog) {
            super();
            this.mContext = context;
            this.isShowDialog = isShowDialog;
        }
        
        /**
         * 检测软件更新
         */
        public void checkUpdate() {
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    if (isUpdate()) {
                        //显示提示对话框
                        showNoticeDialog();
                    } else {
                        if(isShowDialog){
                            ((Activity)mContext).runOnUiThread(new Runnable() {
                                
                                @Override
                                public void run() {
                                    if(!NetUtil.isNetworkAvailable(mContext)){
                                        Toast.makeText(mContext,"无适用的网络", 1).show();
                                    }else{
                                        Toast.makeText(mContext, "已经是最新版本", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });
                        }
                    }
                }
            }).start();
        }
        
        private void showNoticeDialog() {
            ((Activity)mContext).runOnUiThread(new Runnable() {
                
                @Override
                public void run() {
                    //构造对话框
                    AlertDialog.Builder builder = new Builder(mContext);
                    builder.setTitle(R.string.soft_update_title);
                    builder.setMessage(msg);
                    handler.postDelayed(new Runnable() {
                        
                        @Override
                        public void run() {
                            noticeDialog.dismiss();
                            showDownloadDialog();
                        }
                    }, 30000);*/
                    //更新
                    builder.setPositiveButton("确定更新", new OnClickListener() {
                        
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            // 显示下载对话框
                            showDownloadDialog();
                        }
                    });
                    // 稍后更新
                    builder.setNegativeButton("稍后更新", new OnClickListener() {
                        
                        @Override
                        public 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(R.string.soft_updating);
            // 给下载对话框增加进度条
            final LayoutInflater inflater = LayoutInflater.from(mContext);
            View view = inflater.inflate(R.layout.softupdate_progress, null);
            mProgressBar = (ProgressBar) view.findViewById(R.id.update_progress);
            builder.setView(view);
            /*builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    // 设置取消状态
                    cancelUpdate = true;
                }
            });*/
            mDownloadDialog = builder.create();
            mDownloadDialog.show();
            //下载文件
            downloadApk();
        }
        
        /**
         * 下载APK文件
         */
        private void downloadApk() {
            // TODO Auto-generated method stub
            // 启动新线程下载软件
            new DownloadApkThread().start();
        }

/**
         * 检查软件是否有更新版本
         * @return
         */
        public boolean isUpdate() {
            // 获取当前软件版本
            double versionCode = Double.valueOf(getVersionCode(mContext));
            try {
                mHashMap = parseServerUrl();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(null != mHashMap && mHashMap.size() >0) {
                double serviceCode = Double.valueOf(mHashMap.get("version"));
                //版本判断
                if(serviceCode > versionCode) {
                    return true;
                }
            }
            return false;
        }

//从服务器获取版本号;

private Map<String, String> parseServerUrl(){
            Map<String, String> hashMap = new HashMap<String, String>();
             URL url = null;
                HttpURLConnection httpurlconnection = null;
                try  
                {
                    Locale locale = mContext.getResources().getConfiguration().locale;
                    String language = locale.getLanguage();
                    if (language.endsWith("zh"))
                        url = new URL("http://#######/chinese/android/update.php");
                    else
                        url = new URL("http://#######/android/update.php");
                    
                    
                  httpurlconnection = (HttpURLConnection) url.openConnection();
                  httpurlconnection.setDoOutput(true);
                  httpurlconnection.setRequestMethod("POST");
                  int code = httpurlconnection.getResponseCode();
                  Log.i("http_post", code+"");
                  
                  InputStream inputStream = httpurlconnection.getInputStream();
                  byte[] buffer = new byte[5000];
                  inputStream.read(buffer);
                  final String bufferStr = new String(buffer);
                  
                  
                  //json解析;
                  JSONObject jo = new JSONObject(bufferStr);
                  String version = jo.getString("version");
                  String downloadUrl = jo.getString("url");
                  msg = jo.getString("msg");
                  /*
                  int start = bufferStr.indexOf("<config_version>");
                  int end = bufferStr.indexOf("</config_version>");
                  
                  int start2 = bufferStr.indexOf("<download_url>");
                  int end2 = bufferStr.indexOf("</download_url>");
                  
                  int start3 = bufferStr.indexOf("<version_description>");
                  int end3 = bufferStr.indexOf("</version_description>");
                  
                  
                  String version = bufferStr.substring(start+16, end);
                  String downloadUrl = bufferStr.substring(start2+14,end2);
                  msg = bufferStr.substring(start3+21,end3);
                  */
                  System.out.println("1111111111111  66666666 version =  " +version);
                  System.out.println("11111111116666666666  downloadUrl= " +downloadUrl);
                  System.out.println("111111111111666666   msg = " +msg);
                  
                  
                  String name = downloadUrl.substring(downloadUrl.lastIndexOf("/")+1, downloadUrl.length());
                  hashMap.put("url", downloadUrl);
                  hashMap.put("version", version);
                  hashMap.put("name", name);
                  Log.i("http_post", bufferStr);
                }
                catch(Exception e)
                {
                  e.printStackTrace();
                }
                finally
                {
                  if(httpurlconnection!=null)
                    httpurlconnection.disconnect();
                }
            return hashMap;
        }

/**
         * 获取软件版本号
         * @param context
         * @return
         */
        private String getVersionCode(Context context) {
            // TODO Auto-generated method stub
            String versionName="";

// 根据软件的包名获取软件版本号,对应AndroidManifest.xml下android:versionCode
            try {
                versionName = context.getPackageManager().getPackageInfo(
                        "com.example.update", 0).versionName;
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return versionName;
        }
        
        /**
         * 下载文件线程
         * @author Administrator
         *
         */
        private class DownloadApkThread extends Thread {
            @Override
            public void run() {
                try
                {
                    //判断SD卡是否存在,并且是否具有读写权限
                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
                    {
                        // 获取SDCard的路径
                        String sdpath = Environment.getExternalStorageDirectory() + "/";
                        mSavePath = sdpath + "download";
                        URL url = new URL(mHashMap.get("url"));
                        // 创建连接
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.connect();
                        // 获取文件大小
                        int length = conn.getContentLength();
                        // 创建输入流
                        InputStream is = conn.getInputStream();

File file = new File(mSavePath);
                        // 如果文件不存在,新建目录
                        if (!file.exists())
                        {
                            file.mkdir();
                        }
                        File apkFile = new File(mSavePath, mHashMap.get("name"));
                        FileOutputStream fos = new FileOutputStream(apkFile);
                        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)
                            {
                                // 下载完成
                                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();
                }
                // 取消下载对话框显示
                mDownloadDialog.dismiss();
            }
        }
        
        /**
         * 安装APK文件
         */
        private void installApk()
        {
            File apkfile = new File(mSavePath, mHashMap.get("name"));
            if (!apkfile.exists())
            {
                return;
            }
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
            mContext.startActivity(i);
        }
    
    
    
    
    }

时间: 2024-10-09 09:13:17

android检测版本更新的相关文章

安卓APP采用观察者模式实现检测版本更新

第一步:定义观察者 public interface CheckVersionObserver { /** * 在MainActivity里面检测版本更新成功 * @param mainEntity */ public void onCheckNewVerSuccInMain(MainEntity mainEntity); /** * 检测新版本失败 * @param errorCode * @param msg */ public void onCheckNewVerFail(int erro

Android提示版本更新操作流程

2014年5月8日: andorid的app应用中都会有版本更新的操作,今天空闲的时候就花了点心思弄了一下,主要技术方面用到了AsyncTask异步加载.http协议.json解析.获取版本号等... 下面就来介绍一下大概的流程吧,首先呢: activity_main.xml: <Button android:id="@+id/chek_newest_version" android:layout_width="fill_parent" android:lay

android关于版本更新问题

在Android中,检测版本更新是每个app很常见的功能,我们也尝试简单实现一下吧~ 布局代码这里就不需要写了,一个按钮即可检测更新,这里我是以一个gson文件作为示例请求比对版本... 第一步解析数据: //请求网络服务器上的版本 final String url="http://192.168.253.2:8080/gson/banbenwenjian.json"; HttpUtils utils=new HttpUtils(); utils.configTimeout(5000)

iOS 检测版本更新(02)

iOS 检测版本更新 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bundle version中获取: [cpp] view plaincopy NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; CFShow(infoDic); NSString *appVersion = [infoDic

Android -- 检测耳机插入状态

原理                                                                                    其实android系统在耳机插入和拔出的时候都会发送广播,所以我们要想检测耳机的状态只需要注册响应的BroadCastReceiver,对状态进行响应的判断就ok了. 这个广播的名字叫做:android.intent.action.HEADSET_PLUG Code                               

android检测网络连接状态示例讲解

网络的时候,并不是每次都能连接到网络,因此在程序启动中需要对网络的状态进行判断,如果没有网络则提醒用户进行设置 Android连接首先,要判断网络状态,需要有相应的权限,下面为权限代码(AndroidManifest.xml): 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="a

iOS 检测版本更新

iOS 检测版本更新 分类: IOS_XCODE 2013-07-19 16:52 18252人阅读 评论(5) 收藏 举报 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bundle version中获取: [cpp] view plaincopy NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionar

android 检测ListView滚动到的位置

ListView滚动 1.要用到一个监听事件是:setOnScrollListener(); API解释是: Set the listener that will receive notifications every time the list scrolls. Parameters:l the scroll listener 2.它里面包含了两个方法: 一个是:onScrollStateChanged(AbsListView view, int scrollState),用来表明ListVi

Android检测WIFI连接、提示框延时消失

Android检测系统WIFI是否连接?如没有连接,显示提示框,提示进行设置,当点击设置进入系统WIFI界面后1秒钟,提示框自动消失. 代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public boolean isWifiConnected(Context context) {         ConnectivityM