Android版本检测升级

我们应该都有类似的使用体验,当一款APP需要更新是,进入界面会提醒有新的更新是否更新,这里有那么几个步骤

1首先检测当前版本

2判断服务器中版本

3如果有更新则点击更新,下载安装包,下载完成后自动安装

具体代码怎么实现呢?下面我们一起看一下

    /*
     * 获取当前程序的版本号
     */
    private String getVersionName() throws Exception{
        //获取packagemanager的实例
        PackageManager packageManager = getPackageManager();
        //getPackageName()是你当前类的包名,0代表是获取版本信息
        PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
        return packInfo.versionName;
    }

读取服务器版本号

    /*
     * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
     */
    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()); //获取要升级的APK文件
                }else if ("description".equals(parser.getName())){
                    info.setDescription(parser.nextText()); //获取该文件的信息
                }
                break;
            }
            type = parser.next();
        }
        return info;
    }

下载

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

版本匹配、自动安装

    /*
     * 从服务器获取xml解析并进行比对版本号
     */
    public class CheckVersionTask implements Runnable{

        public void run() {
            try {
                //从资源文件获取服务器 地址
                String path = getResources().getString(R.string.serverurl);
                //包装成url的对象
                URL url = new URL(path);
                HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                InputStream is =conn.getInputStream();
                info =  UpdataInfoParser.getUpdataInfo(is);

                if(info.getVersion().equals(versionname)){
                    Log.i(TAG,"版本号相同无需升级");
                    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_CLIENT:
                //对话框通知用户升级程序
                showUpdataDialog();
                break;
            case GET_UNDATAINFO_ERROR:
                //服务器超时
                Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();
                LoginMain();
                break;
            case DOWN_ERROR:
                //下载apk失败
                Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
                LoginMain();
                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 OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
                Log.i(TAG,"下载apk,更新");
                downLoadApk();
            }
        });
        //当点取消按钮时进行登录
        builer.setNegativeButton("取消", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                LoginMain();
            }
        });
        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);
    }

    /*
     * 进入程序的主界面
     */
    private void LoginMain(){
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);
        //结束掉当前的activity
        this.finish();
    }

相关类

public class UpdataInfo {
    private String version;
    private String url;
    private String description;
    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;
    }
}

相关布局

<?xml version="1.0" encoding="utf-8"?>
<info>
    <version>2.0</version>
    <url>http://192.168.0.64:8080/mobilesafe.apk</url>
    <description>检测到最新版本,请及时更新!</description>
</info>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 20:46:17

Android版本检测升级的相关文章

Android 版本检测更新

Android版本检测更新是每个应用升级所不可少的,以前早就做过一些,一直没有时间与大家分享,现在就跟大家来分享一下我做的版本检测更新吧.先上图 点击更新之后的 可能有人会问为啥点击更新提示框不消失啊,可以根据自己的情况而定,有的需要强制更新,也是为了方便用户看到下载的进度.我这里只是为了测试一下效果而已.真正的是点击更新以后会在通知栏里面进行显示的 效果就是这样的 也有的可能需要在桌面上面展示给用户,下面的效果 这些都是是需求而定的.不多说了上代码 package com.liuyongxia

解决android模块化升级的办法

关于原生android版本更新升级必须整个apk更新安装,不能实现部分模块化升级的解决思路: 原生+web混合型APP~ 具体应客户要求,程序必须实现模块化升级,不管用何种办法,我是这么做的,每个功能首页写成html放本地(asset),html里面action操作全部请求服务器端的,之间的传值使用签名+验签方式确保信息安全 [首页放本地而不放服务端是解决即使没网情况下,也可以很友好的给用户展示一个页面] 这个只是我想到的一种解决方案,还有好的方案,请一起分享 public class Main

Android在线升级相关笔记一(解析服务器版本与当前版本比较)

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较, 如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级. 一.首先用tomcat搭建服务器,用于开发测试. 下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625 1.在tomcat中新建自己的项目: \apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,

Android Studio升级后报 method not found: &#39;runProguard&#39;的错误

今天升级了下Android Studio,然后发现更新gradle,然后在sync项目的时候总是报  method not found: 'runProguard'的错误 找了很多发现不对. 最后解决办法是这样的,修改app下 build.gradle文件. If you are using version 0.14.0 or higher of the gradle plugin, you should replace "runProguard" with"minifyEn

Android Studio升级到0.8.1后如何设置字体大小?

升级到0.8.1后,打开设置字体大小页面,你会发现不管是Default还是Darcula,都不允许你改变字体的大小,其实这个是因为这两个模式是Android Studio自带模式,所以不允许你改动,你要改的话要自定义自己的模式.如下图: 选中一个你想要的样式,然后点击Save as,然后在弹出的对话框中输入你自己定义的样式的名称. 然后再把Scheme name选择成你自定义的样式,这个时候就可以改了. Android Studio升级到0.8.1后如何设置字体大小?,布布扣,bubuko.co

Android Studio升级后工程Build failed.

最近在升级Android Studio后,发现原先能编译通过的工程,突然就编译不过了,原因是生成的AndroidManifest.xml文件中有乱码. 升级后: android studio 0.6.0 build tools 19.1.0 Android SDK tools 22.6.4. gradle 0.11.+ 错误信息: Error Info Error:(11) Error parsing XML: not well-formed (invalid token) Error:(11)

android 在线升级借助开源中国App源码

http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: 1: checkAppUpdate 检查是或需要升级 // 网络连接判断         if (appContext.isNetworkConnected()) {             // 检查新版本             if (appContext.isCheckUp()) {                    UpdateM

Android 数据库升级完整解决方案

数据库升级的意义 我们在开发Android应用的时候,不可避免地要使用数据库.而数据库的结构在第一版的时候定下来,之后发布功能更新,或增加业务逻辑,原来的数据库结构可能就不适用了.而如果数据库的结构与之前版本的结构不同,新版本的应用读取旧数据库肯定会出问题.解决办法只有两种: 1.让用户卸载老版本再安装新的程序: 2.软件自行更新数据库结构. 第一种办法很明显不具备可操作性,而且用户一旦卸载软件,数据就丢失了,这是不能容忍的事情.因此,作为开发者必须妥善处理数据库的升级问题. 当然了,有的同学会

优雅的处理Android数据库升级的问题

原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 import and