手机安全卫士学习之APK检查自动升级

来源:互联网 发布:淘宝品质工厂怎么加入 编辑:程序博客网 时间:2024/06/05 15:20

1.APK在线升级

现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持。一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端。当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级。

2.Json文件

将json文件放到web服务器的Root目录下

[{"version":2.0,"description":"下载送大礼包","apkurl","http://192.168.1.127"}]

版本的比较,是根据update_version.json中的verCode以及apk文件中AndroidManifest.xml文件中的定义的版本号:

android:versionCode="1"android:versionName="1.0"

3.在主Activity文件中的onCreate()方法中调用checkUpdate();方法,检查升级

/**     * 检查是否有新版本,如果有就升级     */    private void checkUpdate() {        new Thread(){            public void run() {                //URL                Message mes = Message.obtain();                long startTime = System.currentTimeMillis();                try {                    URL url = new URL(getString(R.string.serverUrl));                    //联网                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();                    conn.setRequestMethod("GET");                    conn.setReadTimeout(4000);                    int code = conn.getResponseCode();                    if(code == 200)                    {                        //联网成功                        InputStream is = conn.getInputStream();                        //把流转成String类型                        String result = StreamTools.readFromStream(is);                        Log.i(TAG, "联网成功了"+result);                        //JSON解析                        JSONObject obj = new JSONObject();                        version = (String) obj.get("version");                        description = (String) obj.get("description");                        apkurl = (String) obj.get("apkurl");                        //校验是否有新版本                        if(getVersionName().equals(version))                        {                            //版本一致,没有新版本                            mes.what = ENTER_HOME;                        }else                        {                            //有新版本,弹出一升级对话框                            mes.what =SHOW_UPDATE_DIALOG;                        }                    }                } catch (MalformedURLException e) {                    mes.what = URL_ERROR;                    e.printStackTrace();                }catch (IOException e) {                    // TODO: handle exception                    mes.what = NETWORK_ERROR;                    e.printStackTrace();                }catch (JSONException e) {                    // TODO: handle exception                    mes.what = JSON_ERROR;                    e.printStackTrace();                }finally                {                    long endTime = System.currentTimeMillis();                    long dTime = endTime - startTime;                    if(dTime < 2000)                    {                        try {                            Thread.sleep(2000 - dTime);                        } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                    handler.sendMessage(mes);                }            };        }.start();    }
    private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {            case SHOW_UPDATE_DIALOG://显示升级对话框                Log.i(TAG, "显示升级对话框");                showUpdateDialog();                break;            case ENTER_HOME://进入主页面                enterHome();                break;            case URL_ERROR://URL错误                enterHome();                Toast.makeText(getApplicationContext(), "URL错误", 0).show();                break;            case NETWORK_ERROR://网络异常                enterHome();                Toast.makeText(getApplicationContext(), "网络异常", 0).show();                break;            case JSON_ERROR://JSON解析出错                enterHome();                Toast.makeText(SplashActivity.this, "JSON解析出错", 0).show();                break;            }        }    };
        protected void showUpdateDialog() {        AlertDialog.Builder builder = new Builder(this);        builder.setTitle("提升升级");//      builder.setCancelable(false);//点返回键没反应(强制升级)        builder.setOnCancelListener(new OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                //进入主页面                enterHome();                dialog.dismiss();            }        });        builder.setMessage(description);        builder.setPositiveButton("立刻升级", new OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                //下载APK,并且替换安装                if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))                {                    //sdcard存在                    //afnal                    FinalHttp finalHttp = new FinalHttp();                    finalHttp.download(apkurl, Environment.getExternalStorageDirectory().getAbsolutePath()+"/mobilesafe2.0.apk",                            new AjaxCallBack<File>() {                                @Override                                public void onFailure(Throwable t, int errorNo,                                        String strMsg) {                                    t.printStackTrace();                                    Toast.makeText(getApplicationContext(), "下载失败了", 0).show();                                    super.onFailure(t, errorNo, strMsg);                                }                                @Override                                public void onLoading(long count, long current) {                                    super.onLoading(count, current);                                    //当前下载百分比                                    int progress = (int) (current * 100/count);                                    tv_update_info.setText("下载进度:"+progress+"%");                                }                                @Override                                public void onSuccess(File t) {                                    super.onSuccess(t);                                    installAPK(t);                                }                                /**                                 * 安装APK                                 * @param t                                 */                                private void installAPK(File t) {                                    Intent intent = new Intent();                                    intent.setAction("android.intent.action.VIEW");                                    intent.addCategory("android.intent.category.DEFAULT");                                    intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");                                    startActivity(intent);                                }                            });                }else                {                    Toast.makeText(getApplicationContext(), "没有sdcard,请安装上再试", 0).show();                    return;                }            }        });        builder.setNegativeButton("下次再说", new OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                enterHome();//进入主页面            }        });        builder.show();    }
    /**     * @return     * 得到应用程序的版本名称     */    private String getVersionName() {        //用来管理手机的APK        PackageManager manager = getPackageManager();        //得到APK的功能清单文件        try {            PackageInfo info = manager.getPackageInfo(getPackageName(), 0);            return info.versionName;        } catch (Exception e) {            e.printStackTrace();            return "";        }    }
    /**     * 进入主页面     */    protected void enterHome() {        Intent intent = new Intent(this,HomeActivity.class);        startActivity(intent);        //关闭当前页面        finish();    }
0 0