美文网首页
APP内部升级+对7.0以后新特性适配

APP内部升级+对7.0以后新特性适配

作者: Shawn_GBWang | 来源:发表于2018-07-06 11:36 被阅读0次

    public class UpdateChecker {

    // 权限声明

        private static String[]PERMISSIONS_STORAGE = {

    Manifest.permission.READ_EXTERNAL_STORAGE,

                Manifest.permission.WRITE_EXTERNAL_STORAGE};

        private static final int REQUEST_EXTERNAL_STORAGE =1;

        //TAG

        private static final StringTAG ="UpdateChecker";

        // 文件分隔符

        private static final StringFILE_SEPARATOR ="/";

        // 外存sdcard存放路径

        private static final StringFILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() +FILE_SEPARATOR +"autoupdate" +FILE_SEPARATOR;

        // 下载应用存放全路径

        private static final StringFILE_NAME =FILE_PATH +"autoupdate.apk";

        // 更新应用版本标记

        private static final int UPDARE_TOKEN =0x29;

        // 准备安装新版本应用标记

        private static final int INSTALL_TOKEN =0x31;

        //上下文

        private Contextcontext;

        //获取的上级信息

        private Stringmessage;

        // 以华为天天聊hotalk.apk为例

        private Stringspec;

        // 下载应用的对话框

        private Dialogdialog;

        private ProgressDialogprogressDialog;

        // 下载应用的进度条

        private ProgressBarprogressBar;

        // 进度条的当前刻度值

        private int curProgress;

        // 用户是否取消下载

        private boolean isCancel;

        //版本对比地址

        private AppVersionmAppVersion;

        public UpdateChecker(Context context) {

    this.context = context;

            mAppVersion = AppVersion.getInstance();

        }

    private final Handlerhandler =new Handler() {

    @Override

            public void handleMessage(Message msg) {

    switch (msg.what) {

    case UPDARE_TOKEN:

    //                    progressBar.setProgress(curProgress);

                        progressDialog.setProgress(curProgress);

    //                    dialog.setCanceledOnTouchOutside(false);

                        progressDialog.setCanceledOnTouchOutside(false);

    break;

                    case INSTALL_TOKEN:

    installApp();

    break;

                }

    }

    };

        /**

        * 检测应用更新信息

        */

        public void checkUpdateInfo() {

    Log.i(TAG, "执行检查更新--->");

            showNoticeDialog();

        }

    /**

        * 显示提示更新对话框

        */

        private void showNoticeDialog() {

    verifyStoragePermissions((Activity)context);

            message =mAppVersion.getUpdateMessage();

            AlertDialog.Builder alertDialog =new AlertDialog.Builder(context);

            alertDialog.setTitle("版本更新");

            alertDialog.setMessage(message);

            alertDialog.setCancelable(false);// 设置点击屏幕Dialog不消失

            alertDialog.setPositiveButton("下载", new OnClickListener() {

    @Override

                public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

                    showDownloadDialog();

                }

    });

            alertDialog.setNegativeButton("忽略", new OnClickListener() {

    @Override

                public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

                }

    });

            alertDialog.show();

        }

    /**

        * 显示下载进度对话框

        */

        private void showDownloadDialog() {

    progressDialog =new ProgressDialog(context);

            progressDialog.setMessage("版本更新中..");

            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            progressDialog.setMax(100);

            progressDialog.setButton("取消", new OnClickListener() {

    @Override

                public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

                    setisCancel();

                }

    });

            progressDialog.show();

            downloadApp();

    //        View view = LayoutInflater.from(context).inflate(R.layout.progressbar, null);

    //        progressBar = (ProgressBar) view.findViewById(R.id.progressBar);

    //        AlertDialog.Builder builder = new AlertDialog.Builder(context);

    //        builder.setTitle("软件版本更新中..");

    //        builder.setView(view);

    //        builder.setNegativeButton("取消", new OnClickListener() {

    //            @Override

    //            public void onClick(DialogInterface dialog, int which) {

    //                dialog.dismiss();

    //                setisCancel();

    ////                isCancel = true;

    //            }

    //        });

    //        dialog = builder.create();

    //

    //        dialog.show();

    //        downloadApp();

        }

    private void setisCancel() {

    isCancel =true;

        }

    /**

        * 下载新版本应用

        */

        private void downloadApp() {

    new Thread(new Runnable() {

    @Override

                public void run() {

    URL url =null;

                    InputStream in =null;

                    FileOutputStream out =null;

                    HttpURLConnection conn =null;

                    spec =mAppVersion.getApkUrl();

    //                spec="http://192.168.200.189:8080/FamilinkSYS/APP/app-debug.apk";

                    try {

    url =new URL(spec);

                        conn = (HttpURLConnection) url.openConnection();

                        conn.connect();

                        long fileLength = conn.getContentLength();

                        in = conn.getInputStream();

                        File filePath =new File(FILE_PATH);

                        if (!filePath.exists()) {

    filePath.mkdir();

                        }

    out =new FileOutputStream(new File(FILE_NAME));

                        byte[] buffer =new byte[1024];

                        int len =0;

                        long readedLength =0l;

                        while ((len = in.read(buffer)) != -1) {

    // 用户点击“取消”按钮,下载中断

                            if (isCancel) {

    break;

                            }

    out.write(buffer, 0, len);

                            readedLength += len;

                            curProgress = (int) (((float) readedLength / fileLength) *100);

                            handler.sendEmptyMessage(UPDARE_TOKEN);

                            if (readedLength >= fileLength) {

    progressDialog.dismiss();

    //                            dialog.dismiss();

                                // 下载完毕,通知安装

                                handler.sendEmptyMessage(INSTALL_TOKEN);

    break;

                            }

    }

    out.flush();

                    }catch (Exception e) {

    e.printStackTrace();

                    }finally {

    if (out !=null) {

    try {

    out.close();

                            }catch (IOException e) {

    e.printStackTrace();

                            }

    }

    if (in !=null) {

    try {

    in.close();

                            }catch (IOException e) {

    e.printStackTrace();

                            }

    }

    if (conn !=null) {

    conn.disconnect();

                        }

    }

    }

    }).start();

        }

    /**

        * 安装新版本应用

        */

        private void installApp() {

    File appFile =new File(FILE_NAME);

            if (!appFile.exists()) {

    return;

            }

    Intent intent =new Intent();

            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.setAction(Intent.ACTION_VIEW);

            // 7.0 以上安装方式改变,进行适配

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

    //参数1 上下文, 参数2 在AndroidManifest中的android:authorities值, 参数3  共享的文件

                Uri apkUri = FileProvider.getUriForFile(context, "包名", appFile);

                intent.setDataAndType(apkUri, "application/vnd.android.package-archive");

                // 添加这一句表示对目标应用临时授权该Uri所代表的文件

                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

            }else {

    // 跳转到新版本应用安装页面

                intent.setDataAndType(Uri.parse("file://" + appFile.toString()), "application/vnd.android.package-archive");

            }

    context.startActivity(intent);

        }

    /**

        * 6.0以上系统,检查权限是否获取

        *

        * @param activity

        */

        public static void verifyStoragePermissions(Activity activity) {

    int permission = ActivityCompat.checkSelfPermission(activity,

                    Manifest.permission.WRITE_EXTERNAL_STORAGE);

            if (permission != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,

                        REQUEST_EXTERNAL_STORAGE);

            }

    }

    }

    相关文章

      网友评论

          本文标题:APP内部升级+对7.0以后新特性适配

          本文链接:https://www.haomeiwen.com/subject/qipvuftx.html