android 应用自身检测版本并下载

发布时间:2020-06-27 01:58:02 作者:巡洋舰cool
来源:网络 阅读:604

思路:1在服务器固定目录存放固定的了版本文件;

           2.应用请求服务器端的版本文件,判断是否有最新版本;

     3.创建下载连接,下载最新apk;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.util.Xml;


/**
 * Created by shijian on 15-8-13.
 * 检查应用版本
 */
public class CheckVersionUtil {

    public void checkVersion(Context context) {

        this.context = context;
        threadPool.execute(checkVersion);
    }

    /**
     * 检查版本线程
     * @author shijian
     */
    Runnable checkVersion = new Runnable() {

        @Override
        public void run() {

            try {
                //从清单文件中获得当前版本号
                PackageInfo info = context.getPackageManager().getPackageInfo("cn.com.shijian.test", 0);
                float localVersion = Float.valueOf(info.versionName);
                float serverVersion = 0;

                //版本文件在服务器上的路径
                String versionPath = CommonUtil.prefixUrl + File.separator + context.getString(R.string.apkversionUrl);

                URL url = new URL(versionPath);

                HttpURLConnection conn= (HttpURLConnection)url.openConnection();

                //读入XML文件输入流
                InputStream input = conn.getInputStream();
                //解析XML文件
                XmlPullParser parser = Xml.newPullParser();
                try {
                    parser.setInput(input, "utf-8");
                    int eventType = parser.getEventType();

                    while(eventType != XmlPullParser.END_DOCUMENT) {

                        switch (eventType) {

                            case XmlPullParser.START_TAG:

                                //版本
                                if ("version".equals(parser.getName())) {

                                    serverVersion = Float.valueOf(parser.nextText());
                                }
                                //是否强制更新
                                if("ismustupdate".equals(parser.getName())){
                                    ismustupdate = parser.nextText();
                                }
                                if ("description".equals(parser.getName())) {
                                    //换行
                                    description = parser.nextText().replace("\\n", "\n");
                                }
                                break;
                        }
                        eventType = parser.next();
                    }
                    //如果服务器版本号大于本地版本号
                    if (serverVersion > localVersion) {

                        boolean post = handler.post(new Runnable() {
                            @Override
                            public void run() {

                                Builder builder = new Builder(context);
                                builder.setTitle("版本升级");
                                builder.setMessage(description);
                                builder.setPositiveButton("下载最新版", new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        downloadApk();
                                    }
                                });

                                if ("1".equals(ismustupdate)) {
                                    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            dialog.dismiss();
                                        }
                                    });
                                }

                                AlertDialog dialog = builder.create();
                                dialog.show();
                            }
                        });
                        //当前版本是最新版
                    } else if (serverVersion <= localVersion) {
                        if (context.getClass().equals(HomeActivity.class)) {
                            return;
                        }
                        handler.post( new Runnable() {
                            public void run() {

                                AlertDialog.Builder builder = new Builder(context);
                                builder.setTitle("版本升级");
                                builder.setMessage("已经是最新版本");
                                AlertDialog dialog = builder.create();
                                dialog.show();
                            }
                        });

                    }
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                }


            } catch (NameNotFoundException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

                threadPool.shutdown();
            }
        }
    };



    /**
     *
     * 点击下载apk
     * @author shijian
     * @since 2015-8-13
     */
    public void downloadApk() {

        //获得DownloadManager
        final DownloadManager downloadMgr = (DownloadManager)  context.getSystemService(Context.DOWNLOAD_SERVICE);
        //定义下载URI
        Uri apkLocation = Uri.parse(CommonUtil.prefixUrl + File.separator + context.getString(R.string.apkUrl));

        Request  request = new Request(apkLocation);
        //request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
        request.setTitle("e车问更新");
        //如果文件件不存在则建立
        File folder = Environment.getExternalStoragePublicDirectory("echewen");
        if (folder.exists() && folder.isDirectory()){

        } else {
            folder.mkdirs();
        }

        //如果echewen.apk已经存在删除掉,防止出现多个
        File apk = new File(CheckVersionUtil.APK_UPDATE);
        if (apk.exists()) {
            apk.delete();
        }
        //保存下载的文件到指定目录下
        request.setDestinationInExternalPublicDir("echewen", "echewen.apk");
        //该downloadmanager的ID
        final long ref = downloadMgr.enqueue(request);

        IntentFilter filter =  new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);

        BroadcastReceiver receiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                long mRef = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

                if (mRef == ref) {

                    Cursor c = downloadMgr.query(new DownloadManager.Query().setFilterById(mRef));
                    c.moveToFirst();
                    String downloadFile = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

                    Intent installIntent = new Intent(Intent.ACTION_VIEW);
                    installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    installIntent.setDataAndType(Uri.parse(downloadFile),
                            "application/vnd.android.package-archive");//设置intent的数据类型

                    context.startActivity(installIntent);
                }
            }
        };
        context.registerReceiver(receiver, filter);
    }
    //线程池
    ExecutorService threadPool = Executors.newCachedThreadPool();
    Handler handler = new Handler();
    //版本升级说明
    String description;
    //上下文
    Context context;

    String ismustupdate = "0";//0:必须更新;1:不必须


    public static final String APK_UPDATE = Environment.getExternalStorageDirectory().getPath() + "/echewen/echewen.apk";
    public static final String STORAGE_IMAGE_PATH = Environment.getExternalStorageDirectory().getPath() + "/echewen/apk/";

}


推荐阅读:
  1. C#开发Android手机应用全接触(mono for android)
  2. Android应用升级,检测更新,下载,检验,安装

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

检测 版本 android

上一篇:运维故障分析已经恢复实例

下一篇:Mycat读写分离以及拆库拆表综合实验2:部署配置mycat读写分离与拆库拆表

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》