鱼C论坛

 找回密码
 立即注册
查看: 2610|回复: 6

【原创】小白马卫士项目总结之版本更新

[复制链接]
发表于 2014-12-4 09:20:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 青玄 于 2014-12-4 09:21 编辑

版本版本更新:   
实现原理:通过向服务器端发送请求,获取服务端的版本信息,然后再与本机上的软件进行比对,如果版本不一致的话,那就得更新版本!
首先需要一个打开的欢迎界面:
搜狗截图14年12月04日0001_1.png

在这个欢迎界面打开的时候就要判断此软件的版本是否要更新!

需要说明的是在服务器端这边的时候,发给客户顿的是一个json数据,为了更加明确的说明一下,服务端的大概代码是这样的:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import cn.cxrh.daomain.mobile;


public class MobileSafeServlet extends HttpServlet {

        File file = null;
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
                // TODO Auto-generated method stub
        
                List<mobile> mobiles = new ArrayList<mobile>();
                mobiles.add(new mobile("2.0","http://192.168.128.1:8080/safemobile_server/software/qqliulanqi.apk","小白马提醒您,软件是否更新!^_^!"));
                
                
                JSONArray json = JSONArray.fromObject(mobiles);
                resp.getOutputStream().write(json.toString().getBytes("utf-8"));
                
        }


        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
                // TODO Auto-generated method stub
                super.doGet(req, resp);
        }

        
}
注意:这里要说明的是,在服务端进行json数据的发送的时候,还需要用到json的jar包!
然后就是客户端这边的处理了!
首先是需要的一个utils工具类:
package com.example.safemobile_test.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Environment;
import android.util.Log;

import com.example.safemobile_test.daomain.Info;

public class Utils {

        /**
         * 读取服务端发过来的输入流信息,并把它转化为字符串
         * @param is  输入流
         * @return
         * @throws Exception
         */
        public static String readJson(InputStream is) throws Exception
        {
                ByteArrayOutputStream bao = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                
                while((len = is.read(buffer)) != -1)
                {
                        bao.write(buffer, 0, len);
                }
                is.close();
                bao.close();
                
                return new String(bao.toByteArray());
                
        }
        /**
         *  用json解析来获取服务端的信息
         * @param path 这个得路径指的是需要访问服务器端的地址
         * @return   返回的是一个javabean的对象
         * @throws Exception
         */
        public static Info getServerInfo(String path) throws  MalformedURLException,ProtocolException,JSONException,IOException,Exception
        {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setReadTimeout(5000);
                int code = conn.getResponseCode();
                
                if(code == 200)
                {
                        InputStream is = conn.getInputStream();
                        
                        JSONArray jsonArray = new JSONArray(readJson(is));
                        Info info = new Info();
                        
                        for(int i=0; i < jsonArray.length(); i++)
                        {
                                JSONObject object = jsonArray.getJSONObject(i);
                                info.setVersion(object.getString("version"));
                                info.setDesc(object.getString("desc"));
                                info.setPath(object.getString("path"));
                                Log.i("Utils", object.getString("version"));
                                
                        }
                        return info;
                }
                return null;
                
        }
        /**
         * 从服务端下载需要更新的软件
         * @param file  要存放到sdcard的文件的对象
         * @param path   要访问服务端的地址
         * @param pd  进度条
         * @return   返回存放文件的文件对象
         */
        public static File updateSoft(File file,String path,ProgressDialog pd)
        {
                
                try {
                        URL url = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setReadTimeout(5000);
                        int fileLength = conn.getContentLength();
                        pd.setMax(fileLength);
                        int code = conn.getResponseCode();
                        if(code == 200)
                        {
                                FileOutputStream fos = new FileOutputStream(file);
                                
                                InputStream is= conn.getInputStream();
                                byte[] buffer = new byte[1024];
                                
                                int len = -1;
                                int total = 0;
                                
                                while((len = is.read(buffer)) != -1)
                                {
                                        total += len;
                                        fos.write(buffer, 0, len);
                                        pd.setProgress(total);
                                }
                                fos.close();
                                is.close();
                                pd.dismiss();
                                return file;
                        }
                } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (ProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                
                return null;
        }
}
然后就是版本更新的主要代码,也是主类的代码:

package com.example.safemobile_test;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import org.apache.http.ProtocolException;
import org.json.JSONException;

import com.example.safemobile_test.daomain.Info;
import com.example.safemobile_test.utils.Utils;
import com.example.service.BlackNumberService;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;


public class splashactivity extends Activity {
        protected static final int URL_ERROR = 1;
        protected static final int PROTOCOL_ERROR = 2;
        protected static final int JSON_PARSER_ERROR = 3;
        protected static final int INTERNET_ERROR = 4;
        protected static final int READ_DATA_ERROR = 5;
        protected static final int LOAD_MAIN = 6;
        protected static final int SHOW_DIALOG = 7;
        protected static final int UPDADTE_SOFT = 8;
        protected static final int DOWNLOAD_FILE_FAILURE = 9;
        private TextView tv_splash_version;
        private Handler handler;
        private long startTime = 0;
        private Info info = null;
        private ProgressDialog pd;
        private File file;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_splash);
                tv_splash_version = (TextView) this.findViewById(R.id.te_splash_version);
                this.tv_splash_version.setText("版本:" + this.getVersion());  //获取当前的版本
                handler = new Handler(){

                        @Override
                        public void handleMessage(Message msg) {  //接收消息队列里面的消息
                                // TODO Auto-generated method stub
                                switch (msg.what) {
                                case URL_ERROR:
                                        Toast.makeText(splashactivity.this, "url错误", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                case PROTOCOL_ERROR:
                                        Toast.makeText(splashactivity.this, "请求方式错误", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                case JSON_PARSER_ERROR:
                                        Toast.makeText(splashactivity.this, "JSON解析错误", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                case INTERNET_ERROR:
                                        Toast.makeText(splashactivity.this, "网络链接错误", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                case READ_DATA_ERROR:
                                        Toast.makeText(splashactivity.this, "数据解析错误", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                case LOAD_MAIN:
                                        loadMain();
                                        break;
                                case SHOW_DIALOG:
                                        showDialog();
                                        break;
                                case UPDADTE_SOFT:
                                        File file = (File) msg.obj;
                                        installApk(file);
                                        break;
                                case DOWNLOAD_FILE_FAILURE:
                                        Toast.makeText(splashactivity.this, "文件下载失败", Toast.LENGTH_LONG).show();
                                        loadMain();
                                        break;
                                }
                        }
                        
                };
                /********************************************************************************************/
                //子线程去检查服务器是否有新的版本
                this.checkServiceVersion();
        }
        /**
         * ***************此方法是查找此软件的版本是否要更新
         */
        private void checkServiceVersion()
        {
                new Thread()   //开一个子线程,因为主线程不要太多的工作,不然会容易阻塞的
                {
                        public void run()
                        {
                                //连接互联网
                                startTime = System.currentTimeMillis();
                                
                                String path = "http://192.168.128.1:8080/safemobile_server/safemobile_ser";  //访问服务端的地址
                                Message msg = Message.obtain();    //获得消息对象
                                try
                                {
                                        //loadMain();
                                        info = Utils.getServerInfo(path);   //通过json解析获得需要的信息
                                        Log.i("splashactivity", "版本号:"+ info.getVersion());
                                        if(getVersion().equals(info.getVersion()))
                                        {
                                                msg.what = LOAD_MAIN;
                                        }else
                                        {
                                                msg.what = SHOW_DIALOG;
                                        }
                                } catch (MalformedURLException e) {
                                        e.printStackTrace();
                                        msg.what=URL_ERROR;
                                } catch (ProtocolException e) {
                                                e.printStackTrace();
                                                msg.what=PROTOCOL_ERROR;
                                }catch (JSONException e) {
                                        msg.what=JSON_PARSER_ERROR;
                                }catch (IOException e) {
                                        e.printStackTrace();
                                        msg.what=INTERNET_ERROR;
                                }catch (Exception e) {
                                        e.printStackTrace();
                                        msg.what=READ_DATA_ERROR;
                                        
                                }finally
                                {
                                        long edntime = System.currentTimeMillis();
                                        long data = edntime-startTime;
                                        if(data < 2000)
                                        {
                                                try
                                                {
                                                        Thread.sleep(2000 - data);
                                                }catch(Exception e)
                                                {
                                                        e.printStackTrace();
                                                }
                                        
                                                handler.sendMessage(msg);
                                        }
                                }
                        }
                }.start();
        }
        /**
         * 如果要更新的话就显示一个更新的对话框
         */
        public void showDialog()
        {
                AlertDialog.Builder builder = new Builder(this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("升级提醒");
                builder.setMessage(info.getDesc());
                builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                        
                        @Override
                        public void onCancel(DialogInterface dialog) {
                                // TODO Auto-generated method stub
                                loadMain();
                        }
                });
                
                builder.setNegativeButton("否", new OnClickListener(){

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                loadMain();
                                
                        }
                        
                });
                
                builder.setPositiveButton("是", new OnClickListener(){

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                
                                if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
                                {
                                        file = new File(Environment.getExternalStorageDirectory(), info.getPath().substring(info.getPath().lastIndexOf("/")+1));
                                        pd = new ProgressDialog(splashactivity.this);
                                        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                                        pd.setIcon(R.drawable.ic_launcher);
                                        pd.setTitle("下载文件");
                                        pd.setMessage("文件正在下载,请稍后...");
                                        pd.show();
                                        
                                        new Thread(){
                                                public void run()
                                                {
                                                        File newFile = Utils.updateSoft(file, info.getPath(), pd);
                                                        if(newFile !=null)
                                                        {
                                                                installApk(newFile);
                                                        }else 
                                                        {
                                                                Log.i("splashactivity-->newfile: ", newFile+"" + info.getPath());
                                                                Message msg = Message.obtain();
                                                                msg.what = DOWNLOAD_FILE_FAILURE;
                                                                handler.sendMessage(msg);
                                                        }
                                                }
                                        }.start();
                                }else 
                                {
                                        Toast.makeText(splashactivity.this, "sdcard不可用", Toast.LENGTH_LONG).show();
                                }
                                
                        }
                        
                });
                builder.show();
        }
        /**
         * 跳转主页面的方法
         */
        public void loadMain()
        {
                Intent intent = new Intent(this,MainActivity.class);
                startActivity(intent);
//                Intent blackNumberintent = new Intent(this, BlackNumberService.class);
//                startService(blackNumberintent);
                finish();
        }
        /**
         * 
         * 安装应用
         * @param file
         */
        public 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);
                this.finish();
        }
        
        /**
         * 获取当前的版本
         */
        public String getVersion()
        {
                PackageManager packageManager = this.getPackageManager();
                try
                {
                        PackageInfo info = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES);
                        String version = info.versionName;
                        return version;
                }catch(Exception e)
                {
                        e.printStackTrace();
                        return "";
                }
                
        }

}
如果地址错误或者连不上网的话,就出现这个:



如果连接正确的话就是:

搜狗截图14年12月04日0033_3.png

然后就进行下载更新:

搜狗截图14年12月04日0033_4.png

完成安装之后就进入到主界面:

搜狗截图14年12月04日0002_2.png



评分

参与人数 3荣誉 +37 鱼币 +37 贡献 +13 收起 理由
小甲鱼 + 30 + 30 + 10 大爱~~~
qingchen + 2 + 2 支持楼主!
拈花小仙 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-4 16:43:04 | 显示全部楼层
强烈支持玄玄哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 18:59:25 | 显示全部楼层
好好,我在看某智的教程,一起学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 19:43:27 | 显示全部楼层

呵呵! 小仙客气了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 20:10:44 | 显示全部楼层
这感觉好难学的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-1 23:02:46 | 显示全部楼层
哇塞,太赞了~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 15:32:17 | 显示全部楼层

   甲鱼大哥过奖了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表