您的位置:首页 > 移动开发 > Android开发

android 版本更新

2016-07-27 21:16 381 查看
版本更新的思路



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.text.DecimalFormat;

import org.xmlpull.v1.XmlPullParserException;

import com.example.ma.R;

import com.example.ma.bean.NewVersion;

import android.annotation.SuppressLint;

import android.app.AlertDialog;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.app.AlertDialog.Builder;

import android.content.Context;

import android.content.Intent;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.content.DialogInterface.OnCancelListener;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager.NameNotFoundException;

import android.net.Uri;

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 android.widget.Toast;

/**

 *

 *

 */

public class UpdateManager {

    private static final int DOWN_NOSDCARD = 0;

    private static final int DOWN_UPDATE = 1;

    private static final int DOWN_OVER = 2;

    private static UpdateManager updateManager;

    private Context mContext;

    // 通知对话框

    private Dialog noticeDialog;

    // 下载对话框

    private Dialog downloadDialog;

    // '已经是最新' 或者 '无法获取最新版本' 的对话框

    private Dialog latestOrFailDialog;

    // 进度条

    private ProgressBar mProgress;

    // 显示下载数值

    private TextView mProgressText;

    // 查询动画

    private ProgressDialog mProDialog;

    // 进度值

    private int progress;

    // 下载线程

    private Thread downLoadThread;

    // 终止标记

    private boolean interceptFlag;

    // 提示语

    private String updateMsg = "";

    // 返回的安装包url

    private String apkUrl = "";

    // 下载包保存路径

    private String savePath = "";

    // apk保存完整路径

    private String apkFilePath = "";

    // 临时下载文件路径

    private String tmpFilePath = "";

    // 下载文件大小

    private String apkFileSize;

    // 已下载文件大小

    private String tmpFileSize;

    @SuppressWarnings("unused")

    private String curVersionName = "";

    @SuppressWarnings("unused")

    private int curVersionCode;

    private NewVersion mUpdate;

    @SuppressLint("HandlerLeak")

    private Handler mHandler = new Handler() {

        @SuppressLint("ShowToast")

        public void handleMessage(Message msg) {

            switch (msg.what) {

            case DOWN_UPDATE:

                mProgress.setProgress(progress);

                mProgressText.setText(tmpFileSize + "/" + apkFileSize);

                break;

            case DOWN_OVER:

                downloadDialog.dismiss();

                installApk();

                break;

            case DOWN_NOSDCARD:

                downloadDialog.dismiss();

                Toast.makeText(mContext, "无法下载安装文件,请检查SD卡是否挂载",

                        Toast.LENGTH_SHORT).show();

                break;

            }

        };

    };

    public static UpdateManager getUpdateManager() {

        if (updateManager == null) {

            updateManager = new UpdateManager();

        }

        updateManager.interceptFlag = false;

        return updateManager;

    }

    /**

     * 检查App更新

     *

     * @param context

     * @param isShowMsg

     *            是否显示提示消息

     */

    @SuppressLint("HandlerLeak")

    public void checkAppUpdate(Context context, final boolean isShowMsg) {

        this.mContext = context;

        getCurrentVersion();

        if (isShowMsg) {

            if (mProDialog == null)

                mProDialog = ProgressDialog.show(mContext, null, "正在检测,请稍后...",

                        true, true);

            else if (mProDialog.isShowing()

                    || (latestOrFailDialog != null && latestOrFailDialog

                            .isShowing()))

                return;

        }

        final Handler handler = new Handler() {

            @SuppressLint("HandlerLeak")

            public void handleMessage(Message msg) {

                // 进度条对话框不显示 - 检测结果也不显示

                if (mProDialog != null && !mProDialog.isShowing()) {

                    return;

                }

                // 关闭并释放释放进度条对话框

                if (isShowMsg && mProDialog != null) {

                    mProDialog.dismiss();

                    mProDialog = null;

                }

                // 显示检测结果

                if (msg.what == 1) {

                    mUpdate = (NewVersion) msg.obj;

                    if (mUpdate != null) {

                        showNoticeDialog();

                    }

                }

            }

        };

        new Thread() {

            public void run() {

                Message msg = new Message();

                try {

                    // InputStream input = XmlUtils

                    // .getInput("http://www.oschina.net/MobileAppVersion.xml");

                    // NewVersion string = XmlUtils.getUrl(input);

                    NewVersion string = new NewVersion();

                    string.setDownloadUrl("http://www.oschina.net/uploads/osc-android-app-2.6.3-release.apk");

                    string.setUpdateLog("请更新");

                    msg.what = 1;

                    msg.obj = string;

                    handler.sendMessage(msg);

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }.start();

    }

    /**

     * 获取当前客户端版本信息

     */

    private void getCurrentVersion() {

        try {

            PackageInfo info = mContext.getPackageManager().getPackageInfo(

                    mContext.getPackageName(), 0);

            curVersionName = info.versionName;

            curVersionCode = info.versionCode;

        } catch (NameNotFoundException e) {

            e.printStackTrace(System.err);

        }

    }

    /**

     * 显示版本更新通知对话框

     */

    private void showNoticeDialog() {

        AlertDialog.Builder builder = new Builder(mContext);

        builder.setTitle("软件版本更新");

        updateMsg = mUpdate.getUpdateLog();

        apkUrl = mUpdate.getDownloadUrl();

        builder.setMessage(updateMsg);

        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();

            }

        });

        noticeDialog = builder.create();

        noticeDialog.show();

    }

    /**

     * 显示下载对话框

     */

    @SuppressLint("InflateParams")

    private void showDownloadDialog() {

        AlertDialog.Builder builder = new Builder(mContext);

        builder.setTitle("正在下载新版本");

        final LayoutInflater inflater = LayoutInflater.from(mContext);

        View v = inflater.inflate(R.layout.softupdate_progress, null);

        mProgress = (ProgressBar) v.findViewById(R.id.update_progress);

        mProgressText = (TextView) v.findViewById(R.id.update_progress_text);

        builder.setView(v);

        builder.setNegativeButton("取消", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();

                interceptFlag = true;

            }

        });

        builder.setOnCancelListener(new OnCancelListener() {

            @Override

            public void onCancel(DialogInterface dialog) {

                dialog.dismiss();

                interceptFlag = true;

            }

        });

        downloadDialog = builder.create();

        downloadDialog.setCanceledOnTouchOutside(false);

        downloadDialog.show();

        downloadApk();

    }

    private Runnable mdownApkRunnable = new Runnable() {

        @Override

        public void run() {

            try {

                String apkName = "os中国.apk";

                String tmpApk = "os中国.tmp";

                // 判断是否挂载了SD卡

                String storageState = Environment.getExternalStorageState();

                if (storageState.equals(Environment.MEDIA_MOUNTED)) {

                    savePath = Environment.getExternalStorageDirectory()

                            .getAbsolutePath() + "/os中国/Update/";

                    File file = new File(savePath);

                    if (!file.exists()) {

                        file.mkdirs();

                    }

                    apkFilePath = savePath + apkName;

                    tmpFilePath = savePath + tmpApk;

                }

                // 没有挂载SD卡,无法下载文件

                if (apkFilePath == null || apkFilePath == "") {

                    mHandler.sendEmptyMessage(DOWN_NOSDCARD);

                    return;

                }

                File ApkFile = new File(apkFilePath);

                // 是否已下载更新文件

                if (ApkFile.exists()) {

                    downloadDialog.dismiss();

                    installApk();

                    return;

                }

                // 输出临时下载文件

                File tmpFile = new File(tmpFilePath);

                FileOutputStream fos = new FileOutputStream(tmpFile);

                URL url = new URL(apkUrl);

                HttpURLConnection conn = (HttpURLConnection) url

                        .openConnection();

                conn.connect();

                int length = conn.getContentLength();

                InputStream is = conn.getInputStream();

                // 显示文件大小格式:2个小数点显示

                DecimalFormat df = new DecimalFormat("0.00");

                // 进度条下面显示的总文件大小

                apkFileSize = df.format((float) length / 1024 / 1024) + "MB";

                int count = 0;

                byte buf[] = new byte[1024];

                do {

                    int numread = is.read(buf);

                    count += numread;

                    // 进度条下面显示的当前下载文件大小

                    tmpFileSize = df.format((float) count / 1024 / 1024) + "MB";

                    // 当前进度值

                    progress = (int) (((float) count / length) * 100);

                    // 更新进度

                    mHandler.sendEmptyMessage(DOWN_UPDATE);

                    if (numread <= 0) {

                        // 下载完成 - 将临时下载文件转成APK文件

                        if (tmpFile.renameTo(ApkFile)) {

                            // 通知安装

                            mHandler.sendEmptyMessage(DOWN_OVER);

                        }

                        break;

                    }

                    fos.write(buf, 0, numread);

                } while (!interceptFlag);// 点击取消就停止下载

                fos.close();

                is.close();

            } catch (MalformedURLException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    };

    /**

     * 下载apk

     *

     * @param url

     */

    private void downloadApk() {

        downLoadThread = new Thread(mdownApkRunnable);

        downLoadThread.start();

    }

    /**

     * 安装apk

     *

     * @param url

     */

    private void installApk() {

        File apkfile = new File(apkFilePath);

        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);

    }
}

UpdateManager.getUpdateManager().checkAppUpdate(MainActivity.this, false);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: