Android从服务器检测更新并下载

来源:互联网 发布:税收大数据应用 编辑:程序博客网 时间:2024/06/05 01:15
package zz.itcast.mobilesafez20.activity;

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.URL;

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

import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;

import zz.itcast.mobilesafez20.R;
import zz.itcast.mobilesafez20.app.MobilesafeApplication;
import zz.itcast.mobilesafez20.utils.AppUtils;
import zz.itcast.mobilesafez20.utils.MyConstant;
import zz.itcast.mobilesafez20.utils.StreamTools;
import android.annotation.SuppressLint;
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.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.TextView;

public class SplashActivity extends BaseActivtiy {

    // 用于安装
    protected static final int REQUEST_FOR_INSTALL = 1;

    private int versionCode;
    private String versionName;
    private ProgressDialog pd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_main);
        System.out.println("SplashActivity onCreate");
        /*
         * SplashActivity 闪屏界面 1.显示一个logo 广告 2-3秒消失 2.比如数据的初始化,或者表的创建等等
         * 3.检测版本更新,去服务器检测一下是否有最新版本 如果有新版本弹对话框提示用户更新
         */

        getVersionInfo();

        // 这里自动更新 开发期间肯定是true 这里为了方便写成false
        boolean isUpdate = sp.getBoolean(MyConstant.KEY_AUTO_UPDATE, false);
        if (isUpdate) {
            // 直接去检查版本更新 服务器 联网
            checkUpdate();
        } else {
            // 不更新
            new Thread() {
                public void run() {
                    SystemClock.sleep(1500);
                    gotoHomePageActivity();
                }
            }.start();
        }
    }

    private void checkUpdate() {
        final String path = getString(R.string.update_url);
        new Thread() {
            public void run() {
                try {
                    // 联网前睡一会
                    SystemClock.sleep(1500);

                    URL url = new URL(path);

                    HttpURLConnection conn = (HttpURLConnection) url
                            .openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);

                    int code = conn.getResponseCode();
                    if (code == 200) {
                        // 联网成功
                        InputStream inputStream = conn.getInputStream();
                        // 将流转换成字符串
                        String jsonStr = StreamTools
                                .getStringFromStream(inputStream);
                        // 解析JSON
                        JSONObject jsonObj = new JSONObject(jsonStr);
                        // 通过键值对解析
                        int newCode = jsonObj.getInt("code");
                        String info = jsonObj.getString("info");
                        String apkUrl = jsonObj.getString("apkUrl");

                        System.out.println("新本号:" + newCode + ",新版本信息:" + info
                                + ",apkurl:" + apkUrl);

                        // 获取到服务器版本之后 应该和本地版本做比对
                        if (newCode == versionCode) {
                            // 说明当前已经是最新版本
                            gotoHomePageActivity();
                        } else {
                            // 说明有新版本 弹出提示框
                            showUpdateDialog(info, apkUrl);

                        }

                    } else {
                        // 没联网成功
                        AppUtils.showToast("服务器忙,请稍候重试", SplashActivity.this);
                        gotoHomePageActivity();
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    // 弹一个吐司 服务器忙
                    AppUtils.showToast("服务器忙,请稍候重试", act);
                    // 直接进入首页
                    gotoHomePageActivity();
                } catch (IOException e) {
                    AppUtils.showToast("请检查网络设置或稍候重试", act);
                    // 直接进入到首页
                    gotoHomePageActivity();
                    e.printStackTrace();
                } catch (JSONException e) {
                    AppUtils.showToast("服务器忙,请稍候重试", act);
                    gotoHomePageActivity();
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                    gotoHomePageActivity();
                    AppUtils.showToast("服务器忙,请稍候重试", act);
                }

            }

        }.start();

    }

    private void showUpdateDialog(String info, final String apkUrl) {
        final AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("升级提示");
        // 显示新版本的特性
        builder.setMessage(info);
        // 取消和确定
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                gotoHomePageActivity();

            }
        });
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 去下载 下载的地址

                downloadApk(apkUrl);

            }

        });

        // 强制用户无法消除对话框
        // builder.setCancelable(false);
        // 给对话框设置一个消失的监听
        builder.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                gotoHomePageActivity();

            }
        });

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                builder.show();
            }
        });

    }

    private void downloadApk(String apkUrl) {

        HttpUtils http = new HttpUtils();


private static final String root = "项目名";


    // /mnt/sdcard/项目名  普通文件的地方
    public static final String ROOT_PATH = Environment

            .getExternalStorageDirectory().getPath() + "/" + root;


    // 下载文件的地方 /mnt/sdcard/mobilesafez20/download

    public static final String DOWNLOAD_PATH = ROOT_PATH + "/download";


        http.download(apkUrl, MyConstant.DOWNLOAD_PATH + "/newapp.apk",
                new RequestCallBack<File>() {

                    // 当开始下载
                    @Override
                    public void onStart() {
                        // TODO Auto-generated method stub
                        super.onStart();

                        pd = new ProgressDialog(SplashActivity.this);
                        pd.setMessage("下载中...");
                        // 设置为水平进度样式
                        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        pd.show();

                    }

                    // 是HttpUtils框架自带的方法 设置最大进度和当前进度
                    @Override
                    public void onLoading(long total, long current,
                            boolean isUploading) {
                        // TODO Auto-generated method stub
                        super.onLoading(total, current, isUploading);
                        if (pd != null) {
                            pd.setMax((int) total);
                            pd.setProgress((int) current);
                        }

                    }

                    @Override
                    public void onSuccess(ResponseInfo<File> responseInfo) {
                        // TODO Auto-generated method stub
                        AppUtils.showToast("下载成功", SplashActivity.this);
                        if (pd != null) {
                            pd.dismiss();
                        }
                        Intent intent = new Intent();
                        intent.setAction("android.intent.action.VIEW");

                        // 通过XUtils框架返回的文件 创建一个Uri
                        Uri uri = Uri.fromFile(responseInfo.result);
                        intent.setDataAndType(uri,
                                "application/vnd.android.package-archive");
                        // 索取结果的开启
                        startActivityForResult(intent, REQUEST_FOR_INSTALL);

                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        // TODO Auto-generated method stub
                        AppUtils.showToast("下载失败", SplashActivity.this);
                    }

                });

    }

    // 用于获取上个界面返回的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub

        if (requestCode == REQUEST_FOR_INSTALL) {
            // 说明是我们的界面的返回数据
            // 如何确定点击的是哪个按钮
            if (resultCode == RESULT_CANCELED) {
                // 说明用户点击的是取消
                System.out.println("用户点击了取消");
                gotoHomePageActivity();
            } else if (resultCode == RESULT_OK) {
                System.out.println("用户点击了确定");
            }

        }

    }

    private void gotoHomePageActivity() {
        Intent intent = new Intent(this, HomepageActivity.class);
        startActivity(intent);
        finish();
    }

    private void getVersionInfo() {
        // 获取版本号和版本名称
        // 包的管理类
        PackageManager pm = getPackageManager();
        // 0代表所有信息都获取
        try {
            // 通过一个方法获取本应用的包名
            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
            // PackageInfo 是一个javaBean 是系统封装的 代表对整个清单文件的封装
            versionCode = packageInfo.versionCode;
            versionName = packageInfo.versionName;

            // ApplicationInfo 是对清单文件中 Application节点的封装
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

0 0
原创粉丝点击