zoukankan      html  css  js  c++  java
  • Android提示版本更新的实现

    一、首先,参考了以下文章《Android自动检测版本及自动升级》
    
    http://www.linuxidc.com/Linux/2011-10/45718p2.htm:
    
    步骤:
    
    1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
    
    2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
    
    3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
    
    
    
    
    
    
    
    
    
    [java] view plaincopy
    获取当前程序的版本号:  
      
    1./*   
    2. * 获取当前程序的版本号    
    3. */     
    4.private String getVersionName() throws Exception{     
    5.    //获取packagemanager的实例       
    6.    PackageManager packageManager = getPackageManager();     
    7.    //getPackageName()是你当前类的包名,0代表是获取版本信息      
    8.    PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);     
    9.    return packInfo.versionName;      
    10.}    
    [java] view plaincopy
    获取服务器端的版本号:   
    1./*   
    2. * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)   
    3. */     
    4.public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{     
    5.    XmlPullParser  parser = Xml.newPullParser();       
    6.    parser.setInput(is, "utf-8");//设置解析的数据源       
    7.    int type = parser.getEventType();     
    8.    UpdataInfo info = new UpdataInfo();//实体      
    9.    while(type != XmlPullParser.END_DOCUMENT ){     
    10.        switch (type) {     
    11.        case XmlPullParser.START_TAG:     
    12.            if("version".equals(parser.getName())){     
    13.                info.setVersion(parser.nextText()); //获取版本号      
    14.            }else if ("url".equals(parser.getName())){     
    15.                info.setUrl(parser.nextText()); //获取要升级的APK文件      
    16.            }else if ("description".equals(parser.getName())){     
    17.                info.setDescription(parser.nextText()); //获取该文件的信息      
    18.            }     
    19.            break;     
    20.        }     
    21.        type = parser.next();     
    22.    }     
    23.    return info;     
    24.}    
    [java] view plaincopy
    从服务器下载apk:   
    1.public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{     
    2.    //如果相等的话表示当前的sdcard挂载在手机上并且是可用的      
    3.    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){     
    4.        URL url = new URL(path);     
    5.        HttpURLConnection conn =  (HttpURLConnection) url.openConnection();     
    6.        conn.setConnectTimeout(5000);     
    7.        //获取到文件的大小       
    8.        pd.setMax(conn.getContentLength());     
    9.        InputStream is = conn.getInputStream();     
    10.        File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");     
    11.        FileOutputStream fos = new FileOutputStream(file);     
    12.        BufferedInputStream bis = new BufferedInputStream(is);     
    13.        byte[] buffer = new byte[1024];     
    14.        int len ;     
    15.        int total=0;     
    16.        while((len =bis.read(buffer))!=-1){     
    17.            fos.write(buffer, 0, len);     
    18.            total+= len;     
    19.            //获取当前下载量      
    20.            pd.setProgress(total);     
    21.        }     
    22.        fos.close();     
    23.        bis.close();     
    24.        is.close();     
    25.        return file;     
    26.    }     
    27.    else{     
    28.        return null;     
    29.    }     
    30.}    
    匹配、下载、自动安装:
    
    [java] view plaincopy
    /*  
     * 从服务器获取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();    
            }     
        }    
    }    
    [java] view plaincopy
    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;      
                }    
        }    
    };   
    [java] view plaincopy
    /*  
     *   
     * 弹出对话框通知用户更新程序   
     *   
     * 弹出对话框的步骤:  
     *  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();    
    }   
    [java] view plaincopy
    /*  
     * 从服务器中下载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();    
    }  
    [java] view plaincopy
    //安装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");//编者按:此处Android应为android,否则造成安装不了      
        startActivity(intent);    
    }    
    [java] view plaincopy
    /*  
     * 进入程序的主界面  
     */    
    private void LoginMain(){    
        Intent intent = new Intent(this,MainActivity.class);    
        startActivity(intent);    
        //结束掉当前的activity      
        this.finish();    
    }  
    二、参考后使用情况:
    1.可以下载apk,但安装失败:
    
    1)以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需;
    
    2)以为是要在执行安装的activity中配置
    
    [html] view plaincopy
    <intent-filter>  
            <action android:name="android.intent.action.VIEW" />  
            <category android:name="android.intent.category.DEFAULT" />  
    </intent-filter>  
    ,其实不是; 
    
    3)代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决;
  • 相关阅读:
    线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板
    数据结构中各种树
    你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)
    memset为int型数组初始化问题
    Dev-C++添加代码格式化(format source code)工具Artistic Style
    让vs IIS Express支持本地静态Json文件
    什么是「供给侧改革」? 原标题:中央提的“供给侧改革”是啥意思?有谁能解说下吗?
    PowerDesigner用法和技巧
    php 调用 web Server(短信接口示例)
    sae相关配置
  • 原文地址:https://www.cnblogs.com/ruiati/p/3340792.html
Copyright © 2011-2022 走看看