APP内部升级+对7.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以后新特性适配)