Android版本检测与更新

由于大家提出的注释的问题,我做了一些修改,进行了一定的注释说明,更新一下,希望大家多多支持,谢谢!

package com.autoupdate;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.util.Log;
import android.webkit.URLUtil;
import com.autoupdate.R;

/**
* 版本检测,自动更新
* 
* @author shenyj-ydrh 1.通过Url检测更新 2.下载并安装更新 3.删除临时路径
* 
*/
public class MyAutoUpdate {
        // 调用更新的Activity
        public Activity activity = null;
        // 当前版本号
        public int versionCode = 0;
        // 当前版本名称
        public String versionName = "";
        // 控制台信息标识
        private static final String TAG = "AutoUpdate";
        // 文件当前路径
        private String currentFilePath = "";
        // 安装包文件临时路径
        private String currentTempFilePath = "";
        // 获得文件扩展名字符串
        private String fileEx = "";
        // 获得文件名字符串
        private String fileNa = "";
        // 服务器地址
        private String strURL = "http://127.0.0.1:8080/ApiDemos.apk";
        private ProgressDialog dialog;

        /**
         * 构造方法,获得当前版本信息
         * 
         * @param activity
         */
        public MyAutoUpdate(Activity activity) {
                this.activity = activity;
                // 获得当前版本
                getCurrentVersion();
        }

        /**
         * 检测更新
         */
        public void check() {
                // 检测网络
                if (isNetworkAvailable(this.activity) == false) {
                        return;
                }
                // 如果网络可用,检测到新版本
                if (true) {
                        // 弹出对话框,选择是否需要更新版本
                        showUpdateDialog();
                }
        }

        /**
         * 检测是否有可用网络
         * 
         * @param context
         * @return 网络连接状态
         */
        public static boolean isNetworkAvailable(Context context) {
                try {
                        ConnectivityManager cm = (ConnectivityManager) context
                                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                        // 获取网络信息
                        NetworkInfo info = cm.getActiveNetworkInfo();
                        // 返回检测的网络状态
                        return (info != null && info.isConnected());
                } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                }
        }

        /**
         * 弹出对话框,选择是否需要更新版本
         */
        public void showUpdateDialog() {
                @SuppressWarnings("unused")
                AlertDialog alert = new AlertDialog.Builder(this.activity)
                                .setTitle("新版本").setIcon(R.drawable.ic_launcher)
                                .setMessage("是否更新?")
                                .setPositiveButton("是", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                // 通过地址下载文件
                                                downloadTheFile(strURL);
                                                // 显示更新状态,进度条
                                                showWaitDialog();
                                        }
                                })
                                .setNegativeButton("否", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                dialog.cancel();
                                        }
                                }).show();
        }

        /**
         * 显示更新状态,进度条
         */
        public void showWaitDialog() {
                dialog = new ProgressDialog(activity);
                dialog.setMessage("正在更新,请稍候...");
                dialog.setIndeterminate(true);
                dialog.setCancelable(true);
                dialog.show();
        }

        /**
         * 获得当前版本信息
         */
        public void getCurrentVersion() {
                try {
                        // 获取应用包信息
                        PackageInfo info = activity.getPackageManager().getPackageInfo(
                                        activity.getPackageName(), 0);
                        this.versionCode = info.versionCode;
                        this.versionName = info.versionName;
                } catch (NameNotFoundException e) {
                        e.printStackTrace();
                }
        }

        /**
         * 截取文件名称并执行下载
         * 
         * @param strPath
         */
        private void downloadTheFile(final String strPath) {
                // 获得文件文件扩展名字符串
                fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())
                                .toLowerCase();
                // 获得文件文件名字符串
                fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,
                                strURL.lastIndexOf("."));
                try {
                        if (strPath.equals(currentFilePath)) {
                                doDownloadTheFile(strPath);
                        }
                        currentFilePath = strPath;
                        new Thread(new Runnable() {

                                @Override
                                public void run() {
                                        // TODO Auto-generated method stub
                                        try {
                                                // 执行下载
                                                doDownloadTheFile(strPath);
                                        } catch (Exception e) {
                                                Log.e(TAG, e.getMessage(), e);
                                        }
                                }
                        }).start();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        /**
         * 执行新版本进行下载,并安装
         * 
         * @param strPath
         * @throws Exception
         */
        private void doDownloadTheFile(String strPath) throws Exception {
                Log.i(TAG, "getDataSource()");
                // 判断strPath是否为网络地址
                if (!URLUtil.isNetworkUrl(strPath)) {
                        Log.i(TAG, "服务器地址错误!");
                } else {
                        URL myURL = new URL(strPath);
                        URLConnection conn = myURL.openConnection();
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        if (is == null) {
                                throw new RuntimeException("stream is null");
                        }
                        //生成一个临时文件 
                        File myTempFile = File.createTempFile(fileNa, "." + fileEx);
                        // 安装包文件临时路径
                        currentTempFilePath = myTempFile.getAbsolutePath();
                        FileOutputStream fos = new FileOutputStream(myTempFile);
                        byte buf[] = new byte[128];
                        do {
                                int numread = is.read(buf);
                                if (numread <= 0) {
                                        break;
                                }
                                fos.write(buf, 0, numread);
                        } while (true);
                        Log.i(TAG, "getDataSource() Download  ok...");
                        dialog.cancel();
                        dialog.dismiss();
                        // 打开文件
                        openFile(myTempFile);
                        try {
                                is.close();
                        } catch (Exception ex) {
                                Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex);
                        }
                }
        }

        /**
         * 打开文件进行安装
         * 
         * @param f
         */
        private void openFile(File f) {
                Intent intent = new Intent();
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setAction(android.content.Intent.ACTION_VIEW);
                // 获得下载好的文件类型
                String type = getMIMEType(f);
                // 打开各种类型文件
                intent.setDataAndType(Uri.fromFile(f), type);
                // 安装
                activity.startActivity(intent);
        }

        /**
         * 删除临时路径里的安装包
         */
        public void delFile() {
                Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted.");
                File myFile = new File(currentTempFilePath);
                if (myFile.exists()) {
                        myFile.delete();
                }
        }

        /**
         * 获得下载文件的类型
         * 
         * @param f
         *            文件名称
         * @return 文件类型
         */
        private String getMIMEType(File f) {
                String type = "";
                // 获得文件名称
                String fName = f.getName();
                // 获得文件扩展名
                String end = fName
                                .substring(fName.lastIndexOf(".") + 1, fName.length())
                                .toLowerCase();
                if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
                                || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
                        type = "audio";
                } else if (end.equals("3gp") || end.equals("mp4")) {
                        type = "video";
                } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
                                || end.equals("jpeg") || end.equals("bmp")) {
                        type = "image";
                } else if (end.equals("apk")) {
                        type = "application/vnd.android.package-archive";
                } else {
                        type = "*";
                }
                if (end.equals("apk")) {
                } else {
                        type += "/*";
                }
                return type;
        }
}

 

摘自:http://www.eoeandroid.com/thread-117764-1-12.html

你可能感兴趣的:(android)