版本更新

版本更新

  • 本文是以解析xml的为例
    .从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

首先我们需要请求网络的信息得到接口里面给我们都是什么信息

我们以这个接口为例:(http://www.oschina.net/MobileAppVersion.xml)
以下是关键的一个更新的工具类:

<code class="hljs java has-numbering"><span class="hljs-keyword">import</span> java.io.BufferedInputStream; 
<span class="hljs-keyword">import</span> java.io.File;
<span class="hljs-keyword">import</span> java.io.FileNotFoundException;
<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.InputStream;
<span class="hljs-keyword">import</span> java.net.HttpURLConnection;
<span class="hljs-keyword">import</span> java.net.MalformedURLException;
<span class="hljs-keyword">import</span> java.net.URL;

<span class="hljs-keyword">import</span> com.bwei.test.url.URLS;

<span class="hljs-keyword">import</span> android.app.AlertDialog;
<span class="hljs-keyword">import</span> android.app.ProgressDialog;
<span class="hljs-keyword">import</span> android.app.AlertDialog.Builder;
<span class="hljs-keyword">import</span> android.content.Context;
<span class="hljs-keyword">import</span> android.content.DialogInterface;
<span class="hljs-keyword">import</span> android.content.Intent;
<span class="hljs-keyword">import</span> android.content.pm.PackageInfo;
<span class="hljs-keyword">import</span> android.content.pm.PackageManager;
<span class="hljs-keyword">import</span> android.content.pm.PackageManager.NameNotFoundException;
<span class="hljs-keyword">import</span> android.net.Uri;
<span class="hljs-keyword">import</span> android.os.Environment;
<span class="hljs-keyword">import</span> android.os.Handler;
<span class="hljs-keyword">import</span> android.os.Message;
<span class="hljs-keyword">import</span> android.util.Log;
<span class="hljs-keyword">import</span> android.widget.Button;
<span class="hljs-keyword">import</span> android.widget.Toast;

<span class="hljs-javadoc">/**
 * 更新版本的工具类
 *<span class="hljs-javadoctag"> @author</span> 
 *<span class="hljs-javadoctag"> @date</span> 
 *
 */</span>


<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UpdateVersionutil</span> {</span>

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String TAG = <span class="hljs-keyword">this</span>.getClass().getName();
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> UPDATA_NONEED = <span class="hljs-number">0</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> UPDATA_CLIENT = <span class="hljs-number">1</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> GET_UNDATAINFO_ERROR = <span class="hljs-number">2</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> SDCARD_NOMOUNTED = <span class="hljs-number">3</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> DOWN_ERROR = <span class="hljs-number">4</span>;
    <span class="hljs-keyword">private</span> Button getVersion;
    <span class="hljs-keyword">private</span> String localVersion;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Context mContext;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> UpdateVersionutil updateVersionutil;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> mNeedUpdate;

    InputStream is;
    <span class="hljs-keyword">private</span> Update parse;

    <span class="hljs-keyword">public</span> <span class="hljs-title">UpdateVersionutil</span>(Context mContext) {
        <span class="hljs-keyword">super</span>();
        <span class="hljs-keyword">this</span>.mContext = mContext;
    }

    <span class="hljs-javadoc">/**
     *   检测更新
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">startUpdate</span>(){
        localVersion = getVersionName();
        CheckVersionTask cv = <span class="hljs-keyword">new</span> CheckVersionTask();
        <span class="hljs-keyword">new</span> Thread(cv).start();
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> UpdateVersionutil  <span class="hljs-title">getUpdataManger</span>(Context context){
        <span class="hljs-keyword">if</span>(updateVersionutil==<span class="hljs-keyword">null</span>){
            updateVersionutil=<span class="hljs-keyword">new</span> UpdateVersionutil(context);
        }
        <span class="hljs-keyword">return</span> updateVersionutil;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">checkUpdata</span>(){
        updateVersionutil.startUpdate();
    }

    <span class="hljs-keyword">private</span> String <span class="hljs-title">getVersionName</span>()   {
        <span class="hljs-comment">//getPackageName()是你当前类的包名,0代表是获取版本信息  </span>
        PackageManager packageManager =mContext.getPackageManager();
        PackageInfo packInfo = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            packInfo = packageManager.getPackageInfo(mContext.getPackageName(),
                    <span class="hljs-number">0</span>);
        } <span class="hljs-keyword">catch</span> (NameNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
        <span class="hljs-keyword">return</span> packInfo.versionName;
    }

    <span class="hljs-javadoc">/**
     *  网络请求
     *  获取到网络接口的版本号进行对比
     *<span class="hljs-javadoctag"> @author</span> 
     *<span class="hljs-javadoctag"> @date</span> 
     */</span>

    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CheckVersionTask</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span> {</span>

        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
            <span class="hljs-keyword">try</span> {
                <span class="hljs-comment">//这里URLS.UPDATE_VERSION 是网络接口获取网络信息</span>
                URL url = <span class="hljs-keyword">new</span> URL(URLS.UPDATE_VERSION);
                <span class="hljs-comment">//*****************************************************</span>
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setConnectTimeout(<span class="hljs-number">5000</span>);
                conn.setRequestMethod(<span class="hljs-string">"GET"</span>); 
                <span class="hljs-keyword">int</span> responseCode = conn.getResponseCode(); 
                <span class="hljs-keyword">if</span> (responseCode == <span class="hljs-number">200</span>) { 
                    <span class="hljs-comment">// 从服务器获得一个输入流 </span>
                    is = conn.getInputStream(); 
                } 
                <span class="hljs-comment">//*******************************************</span>
                <span class="hljs-comment">//调用解析的方法</span>
                parse = Update.parse(is);
                 Url = parse.getDownloadUrl();
                <span class="hljs-comment">//**********************************************</span>
                System.out.println(<span class="hljs-string">"新版版本名:"</span>+parse.getVersionName());
                System.out.println(<span class="hljs-string">"本地版本名:"</span>+localVersion);

                <span class="hljs-comment">//对比版本号</span>
                <span class="hljs-keyword">if</span> (parse.getVersionName().equals(localVersion)) {
                    mNeedUpdate=<span class="hljs-keyword">false</span>;
                    Log.i(TAG, <span class="hljs-string">"版本号相同"</span>);
                    Message msg = <span class="hljs-keyword">new</span> Message();
                    msg.what = UPDATA_NONEED;
                    handler.sendMessage(msg);
                    <span class="hljs-comment">// LoginMain();</span>
                } <span class="hljs-keyword">else</span> {
                    mNeedUpdate=<span class="hljs-keyword">true</span>;
                    Log.i(TAG, <span class="hljs-string">"版本号不相同 "</span>);
                    Message msg = <span class="hljs-keyword">new</span> Message();
                    msg.what = UPDATA_CLIENT;
                    handler.sendMessage(msg);
                }
            } <span class="hljs-keyword">catch</span> (Exception e) {
                Message msg = <span class="hljs-keyword">new</span> Message();
                msg.what = GET_UNDATAINFO_ERROR;
                handler.sendMessage(msg);
                e.printStackTrace();
            }
        }
    }

    Handler handler = <span class="hljs-keyword">new</span> Handler() {
        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(Message msg) {
            <span class="hljs-comment">// TODO Auto-generated method stub</span>
            <span class="hljs-keyword">super</span>.handleMessage(msg);
            <span class="hljs-keyword">switch</span> (msg.what) {
            <span class="hljs-keyword">case</span> UPDATA_NONEED:
                Toast.makeText(mContext, <span class="hljs-string">"不需要更新"</span>,
                        Toast.LENGTH_SHORT).show();
            <span class="hljs-keyword">case</span> UPDATA_CLIENT:
                <span class="hljs-comment">//对话框通知用户升级程序   </span>
                showUpdataDialog();
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> GET_UNDATAINFO_ERROR:
                <span class="hljs-comment">//服务器超时   </span>
                Toast.makeText(mContext, <span class="hljs-string">"获取服务器更新信息失败"</span>, <span class="hljs-number">1</span>).show(); 
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> DOWN_ERROR:
                <span class="hljs-comment">//下载apk失败  </span>
                Toast.makeText(mContext, <span class="hljs-string">"下载新版本失败"</span>, <span class="hljs-number">1</span>).show(); 
                <span class="hljs-keyword">break</span>;
            }
        }
    };
    <span class="hljs-comment">/* 
     *  
     * 弹出对话框通知用户更新程序  
     *  
     * 弹出对话框的步骤: 
     *  1.创建alertDialog的builder.   
     *  2.要给builder设置属性, 对话框的内容,样式,按钮 
     *  3.通过builder 创建一个对话框 
     *  4.对话框show()出来   
     */</span>  
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">showUpdataDialog</span>() {
        AlertDialog.Builder builer = <span class="hljs-keyword">new</span> Builder(mContext);
        builer.setTitle(<span class="hljs-string">"版本升级"</span>);
<span class="hljs-comment">//*********************************************</span>
        <span class="hljs-comment">//更新提示语</span>
        builer.setMessage(parse.getUpdateLog());
<span class="hljs-comment">//*******************************************************</span>
        <span class="hljs-comment">//当点确定按钮时从服务器上下载 新的apk 然后安装   װ</span>
        builer.setPositiveButton(<span class="hljs-string">"立马更新"</span>, <span class="hljs-keyword">new</span> DialogInterface.OnClickListener() {
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(DialogInterface dialog, <span class="hljs-keyword">int</span> which) {
                Log.i(TAG, <span class="hljs-string">"下载apk,更新"</span>);
                downLoadApk();
            }
        });
        builer.setNegativeButton(<span class="hljs-string">"稍后再说"</span>, <span class="hljs-keyword">new</span> DialogInterface.OnClickListener() {
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(DialogInterface dialog, <span class="hljs-keyword">int</span> which) {
                <span class="hljs-comment">// TODO Auto-generated method stub</span>
                <span class="hljs-comment">//do sth</span>
            }
        });
        AlertDialog dialog = builer.create();
        dialog.show();
    }
    <span class="hljs-comment">/* 
     * 从服务器中下载APK 
     */</span>  
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">downLoadApk</span>() {  
        <span class="hljs-keyword">final</span> ProgressDialog pd;    <span class="hljs-comment">//进度条对话框  </span>
        pd = <span class="hljs-keyword">new</span>  ProgressDialog(mContext);  
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
        pd.setMessage(<span class="hljs-string">"正在下载更新"</span>);  
        pd.show();  
        <span class="hljs-keyword">new</span> Thread(){  
            <span class="hljs-annotation">@Override</span>  
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {  
                <span class="hljs-keyword">try</span> {  
                    File file = DownLoadManager.getFileFromServer(parse.getDownloadUrl(), pd);  
                    sleep(<span class="hljs-number">3000</span>);  
                    installApk(file);  
                    pd.dismiss(); <span class="hljs-comment">//结束掉进度条对话框  </span>
                } <span class="hljs-keyword">catch</span> (Exception e) {  
                    Message msg = <span class="hljs-keyword">new</span> Message();  
                    msg.what = DOWN_ERROR;  
                    handler.sendMessage(msg);  
                    e.printStackTrace();  
                }  
            }}.start();  
    }  

    <span class="hljs-comment">//安装apk   </span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">installApk</span>(File file) {  
        Intent intent = <span class="hljs-keyword">new</span> Intent();  
        <span class="hljs-comment">//执行动作  </span>
        intent.setAction(Intent.ACTION_VIEW);  
        <span class="hljs-comment">//执行的数据类型  </span>
        intent.setDataAndType(Uri.fromFile(file), <span class="hljs-string">"application/vnd.android.package-archive"</span>);  
        mContext.startActivity(intent);  
    }  
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String Url;
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getUrl</span>(){

       <span class="hljs-keyword">return</span> Url;
   }

   <span class="hljs-javadoc">/**
    *   判断SD卡是什么状态进行下载
    *<span class="hljs-javadoctag"> @author</span> 
    *<span class="hljs-javadoctag"> @date</span> 
    */</span>

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DownLoadManager</span> {</span>

        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> File <span class="hljs-title">getFileFromServer</span>(String path, ProgressDialog pd)  {
            <span class="hljs-comment">//如果相等的话表示当前的sdcard挂载在手机上并且是可用的</span>
            <span class="hljs-keyword">if</span>(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                URL url = <span class="hljs-keyword">null</span>;
                <span class="hljs-keyword">try</span> {
                    url = <span class="hljs-keyword">new</span> URL(path);
                } <span class="hljs-keyword">catch</span> (MalformedURLException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                HttpURLConnection conn = <span class="hljs-keyword">null</span>;
                <span class="hljs-keyword">try</span> {
                    conn = (HttpURLConnection) url.openConnection();
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                conn.setConnectTimeout(<span class="hljs-number">5000</span>);
                <span class="hljs-comment">//获取到文件的大小 </span>
                pd.setMax(conn.getContentLength());
                InputStream is = <span class="hljs-keyword">null</span>;
                <span class="hljs-keyword">try</span> {
                    is = conn.getInputStream();
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                File file = <span class="hljs-keyword">new</span> File(Environment.getExternalStorageDirectory(), <span class="hljs-string">"updata.apk"</span>);
                FileOutputStream fos = <span class="hljs-keyword">null</span>;
                <span class="hljs-keyword">try</span> {
                    fos = <span class="hljs-keyword">new</span> FileOutputStream(file);
                } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                BufferedInputStream bis = <span class="hljs-keyword">new</span> BufferedInputStream(is);
                <span class="hljs-keyword">byte</span>[] buffer = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];
                <span class="hljs-keyword">int</span> len ;
                <span class="hljs-keyword">int</span> total=<span class="hljs-number">0</span>;
                <span class="hljs-keyword">try</span> {
                    <span class="hljs-keyword">while</span>((len =bis.read(buffer))!=-<span class="hljs-number">1</span>){
                        fos.write(buffer, <span class="hljs-number">0</span>, len);
                        total+= len;
                        <span class="hljs-comment">//获取当前下载量</span>
                        pd.setProgress(total);
                    }
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                <span class="hljs-keyword">try</span> {
                    fos.close();
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                <span class="hljs-keyword">try</span> {
                    bis.close();
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                <span class="hljs-keyword">try</span> {
                    is.close();
                } <span class="hljs-keyword">catch</span> (IOException e) {
                    <span class="hljs-comment">// TODO Auto-generated catch block</span>
                    e.printStackTrace();
                }
                <span class="hljs-keyword">return</span> file;
            }
            <span class="hljs-keyword">else</span>{
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
            }
        }
    }    
} </code>

上面的代码中我们需要用到获取到信息之后进行解析,这里我用的纸xml:

<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
     *      解析获取到输入流
     *<span class="hljs-javadoctag"> @param</span> inputStream
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Update <span class="hljs-title">parse</span>(InputStream inputStream){
        Update update = <span class="hljs-keyword">null</span>;
        <span class="hljs-comment">//获得XmlPullParser解析器</span>
        XmlPullParser xmlParser = Xml.newPullParser();
        <span class="hljs-keyword">try</span> {           
            xmlParser.setInput(inputStream, UTF8);
            <span class="hljs-comment">//获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。</span>
            <span class="hljs-keyword">int</span> evtType=xmlParser.getEventType();
            <span class="hljs-comment">//一直循环,直到文档结束    </span>
            <span class="hljs-keyword">while</span>(evtType!=XmlPullParser.END_DOCUMENT){ 
                String tag = xmlParser.getName(); 
                <span class="hljs-keyword">switch</span>(evtType){ 
                    <span class="hljs-keyword">case</span> XmlPullParser.START_TAG:                       
                        <span class="hljs-comment">//通知信息</span>
                        <span class="hljs-keyword">if</span>(tag.equalsIgnoreCase(<span class="hljs-string">"android"</span>))
                        {
                            update = <span class="hljs-keyword">new</span> Update();
                        }
                        <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(update != <span class="hljs-keyword">null</span>)
                        {
                            <span class="hljs-keyword">if</span>(tag.equalsIgnoreCase(<span class="hljs-string">"versionCode"</span>))
                            {       <span class="hljs-comment">//字符转换整数          </span>
                                update.setVersionCode(toInt(xmlParser.nextText(),<span class="hljs-number">0</span>));
                            }
                            <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(tag.equalsIgnoreCase(<span class="hljs-string">"versionName"</span>))
                            {                           
                                update.setVersionName(xmlParser.nextText());
                            }
                            <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(tag.equalsIgnoreCase(<span class="hljs-string">"downloadUrl"</span>))
                            {                           
                                update.setDownloadUrl(xmlParser.nextText());
                            }
                            <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(tag.equalsIgnoreCase(<span class="hljs-string">"updateLog"</span>))
                            {                           
                                update.setUpdateLog(xmlParser.nextText());
                            }
                        }
                        <span class="hljs-keyword">break</span>;
                    <span class="hljs-keyword">case</span> XmlPullParser.END_TAG:                 
                        <span class="hljs-keyword">break</span>; 
                }
                <span class="hljs-comment">//如果xml没有结束,则导航到下一个节点</span>
                evtType=xmlParser.next();
            }       
        } <span class="hljs-keyword">catch</span> (XmlPullParserException e) {
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">finally</span> {
            <span class="hljs-keyword">try</span> {
                inputStream.close();
            } <span class="hljs-keyword">catch</span> (IOException e) {
                <span class="hljs-comment">// TODO Auto-generated catch block</span>
                e.printStackTrace();
            }   
        }      
        <span class="hljs-keyword">return</span> update;       
    }

    <span class="hljs-javadoc">/**
     * 字符串转整数
     *<span class="hljs-javadoctag"> @param</span> str
     *<span class="hljs-javadoctag"> @param</span> defValue
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">toInt</span>(String str, <span class="hljs-keyword">int</span> defValue) {
        <span class="hljs-keyword">try</span>{
            <span class="hljs-keyword">return</span> Integer.parseInt(str);
        }<span class="hljs-keyword">catch</span>(Exception e){}
        <span class="hljs-keyword">return</span> defValue;
    }</code>

不要忘记了要写相应的bean类:

<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
 *   应用程序更新实体类
 *<span class="hljs-javadoctag"> @author</span> 
 *<span class="hljs-javadoctag"> @date</span> 
 */</span>
<span class="hljs-annotation">@SuppressWarnings</span>(<span class="hljs-string">"serial"</span>)
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Update</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Serializable</span>{</span>

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String UTF8 = <span class="hljs-string">"UTF-8"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String NODE_ROOT = <span class="hljs-string">"oschina"</span>;

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> versionCode;
    <span class="hljs-keyword">private</span> String versionName;
    <span class="hljs-keyword">private</span> String downloadUrl;
    <span class="hljs-keyword">private</span> String updateLog;

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getVersionCode</span>() {
        <span class="hljs-keyword">return</span> versionCode;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setVersionCode</span>(<span class="hljs-keyword">int</span> versionCode) {
        <span class="hljs-keyword">this</span>.versionCode = versionCode;
    }
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getVersionName</span>() {
        <span class="hljs-keyword">return</span> versionName;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setVersionName</span>(String versionName) {
        <span class="hljs-keyword">this</span>.versionName = versionName;
    }
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getDownloadUrl</span>() {
        <span class="hljs-keyword">return</span> downloadUrl;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setDownloadUrl</span>(String downloadUrl) {
        <span class="hljs-keyword">this</span>.downloadUrl = downloadUrl;
    }
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getUpdateLog</span>() {
        <span class="hljs-keyword">return</span> updateLog;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUpdateLog</span>(String updateLog) {
        <span class="hljs-keyword">this</span>.updateLog = updateLog;
    }</code>

然后我们调用这个就可以了
注意上下文

<code class="hljs avrasm has-numbering">UpdateVersionutil<span class="hljs-preprocessor">.getUpdataManger</span>(this)<span class="hljs-preprocessor">.startUpdate</span>()<span class="hljs-comment">;</span></code>

效果展示:

这里写图片描述
这里写图片描述

更新完成!!!

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值