//版本更新 implementation 'com.github.maning0303:MNUpdateAPK:V2.0.3'
//网络请求 implementation 'com.zhy:okhttputils:2.6.2' implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.google.code.gson:gson:2.8.5'
//申请SD卡权限 if (!PermissionUtils.isGrantSDCardReadPermission(getActivity())) { PermissionUtils.requestSDCardReadPermission(getActivity(), 100); } else { UpdateApk(); }
/**获取参数指定的网页代码,将其返回给调用者,由调用者对其解析 * 返回String */ private void UpdateApk() { //第二种 OkHttpUtils .get() .url(UrlConfig.UpdateApk) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { e.printStackTrace(); Log.e("请求异常:", "err"+e); } @Override public void onResponse(String response, int id) { Log.e("请求成功:", "onRespons"+response); try { JSONObject object = new JSONObject(response); UpdateApkBean01 company = MyUtils.getGson().fromJson(response, UpdateApkBean01.class); //apk现在版本信息 double versionCode = APKVersionCodeUtils.getVersionCode(getActivity()); String versionName = APKVersionCodeUtils.getVerName(getActivity()); double num1 = 0.0; num1 = Double.valueOf(versionName); BigDecimal versionCode1 = new BigDecimal(num1); //后台返回apk版本信息 double newVersion = company.getNewVersion(); int isMust = company.getIsMust(); BigDecimal newVersion2 = new BigDecimal(newVersion); if (compare(versionCode1, newVersion2) == 2){ if (company != null && company.getApkData() != null && company.getApkData().size()> 0) { String apkName = company.getApkData().get(company.getApkData().size()-1).getApkName(); verifyStoragePermissions(getActivity()); // final BaseapkBean a = new Gson().fromJson(response, new TypeToken<BaseapkBean>() { // }.getType()); loadApk("https://------/android-apk/patrol/apk/"+apkName); } }else { ToastUtil.showToast(getActivity(),"暂无新版本!"); } } catch (JSONException e) { e.printStackTrace(); } } }); }
/** * 下载app * @param url */ public void loadApk(String url) { pd = ProgressDialog.show(getActivity(), "提示", "版本更新中请稍后", false, true); InstallUtils.with(getActivity()) //必须-下载地址 .setApkUrl(url) //非必须-下载保存的文件的完整路径+name.apk .setApkPath(Constants.APK_SAVE_PATH) //非必须-下载回调 .setCallBack(new InstallUtils.DownloadCallBack() { @Override public void onStart() { //下载开始 } @Override public void onComplete(String path) { //下载完成 //先判断有没有安装权限---适配8.0 //如果不想用封装好的,可以自己去实现8.0适配 InstallUtils.checkInstallPermission(getActivity(), new InstallUtils.InstallPermissionCallBack() { @Override public void onGranted() { //去安装APK //安装APK InstallUtils.installAPK(getActivity(), path, new InstallUtils.InstallCallBack() { @Override public void onSuccess() { //onSuccess:表示系统的安装界面被打开 //防止用户取消安装,在这里可以关闭当前应用,以免出现安装被取消 if (pd.isShowing()) pd.dismiss(); Toast.makeText(getActivity(), "正在安装程序", Toast.LENGTH_SHORT).show(); } @Override public void onFail(Exception e) { if (pd.isShowing()) pd.dismiss(); //安装出现异常,这里可以提示用用去用浏览器下载安装 } }); //取消下载 InstallUtils.cancleDownload(); //是否正在下载 InstallUtils.isDownloading(); //单独设置下载监听 InstallUtils.setDownloadCallBack(new InstallUtils.DownloadCallBack() { @Override public void onStart() { } @Override public void onComplete(String path) { } @Override public void onLoading(long total, long current) { } @Override public void onFail(Exception e) { } @Override public void cancle() { } }); } @Override public void onDenied() { //弹出弹框提醒用户 AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) .setTitle("温馨提示") .setMessage("必须授权才能安装APK,请设置允许安装") .setNegativeButton("取消", null) .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //打开设置页面 InstallUtils.openInstallPermissionSetting(getActivity(), new InstallUtils.InstallPermissionCallBack() { @Override public void onGranted() { //去安装APK InstallUtils.installAPK(getActivity(), path, new InstallUtils.InstallCallBack() { @Override public void onSuccess() { //onSuccess:表示系统的安装界面被打开 //防止用户取消安装,在这里可以关闭当前应用,以免出现安装被取消 Toast.makeText(getActivity(), "正在安装程序", Toast.LENGTH_SHORT).show(); } @Override public void onFail(Exception e) { Toast.makeText(getActivity(), "安装失败:" + e.toString(), Toast.LENGTH_SHORT).show(); if (pd.isShowing()) pd.dismiss(); } }); } @Override public void onDenied() { //还是不允许咋搞? Toast.makeText(getActivity(), "不允许安装咋搞?强制更新就退出应用程序吧!", Toast.LENGTH_SHORT).show(); } }); } }) .create(); alertDialog.show(); } }); } @Override public void onLoading(long total, long current) { //下载中 } @Override public void onFail(Exception e) { //下载失败 } @Override public void cancle() { //下载取消 } }) //开始下载 .startDownload(); }
/** * 动态获取储存的权限 */ private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; public static void verifyStoragePermissions(Activity activity) { try { //检测是否有写的权限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 没有写的权限,去申请写的权限,会弹出对话框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } public int compare(BigDecimal val1, BigDecimal val2) { int result = 0; if (val1.compareTo(val2) < 0) { // result = "第二位数大"; result = 2; } if (val1.compareTo(val2) == 0) { // result = "两位数一样大!"; result = 0; } if (val1.compareTo(val2) > 0) { // result = "第一位数大!"; result = 1; } return result; }
private final String[][] MIME_MapTable={ //{后缀名,MIME类型} {".3gp", "video/3gpp"}, {".apk", "application/vnd.android.package-archive"}, {".asf", "video/x-ms-asf"}, {".avi", "video/x-msvideo"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".class", "application/octet-stream"}, {".conf", "text/plain"}, {".cpp", "text/plain"}, {".doc", "application/msword"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".xls", "application/vnd.ms-excel"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".exe", "application/octet-stream"}, {".gif", "image/gif"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".htm", "text/html"}, {".html", "text/html"}, {".jar", "application/java-archive"}, {".java", "text/plain"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".js", "application/x-javascript"}, {".log", "text/plain"}, {".m3u", "audio/x-mpegurl"}, {".m4a", "audio/mp4a-latm"}, {".m4b", "audio/mp4a-latm"}, {".m4p", "audio/mp4a-latm"}, {".m4u", "video/vnd.mpegurl"}, {".m4v", "video/x-m4v"}, {".mov", "video/quicktime"}, {".mp2", "audio/x-mpeg"}, {".mp3", "audio/x-mpeg"}, {".mp4", "video/mp4"}, {".mpc", "application/vnd.mpohun.certificate"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpg", "video/mpeg"}, {".mpg4", "video/mp4"}, {".mpga", "audio/mpeg"}, {".msg", "application/vnd.ms-outlook"}, {".ogg", "audio/ogg"}, {".pdf", "application/pdf"}, {".png", "image/png"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prop", "text/plain"}, {".rc", "text/plain"}, {".rmvb", "audio/x-pn-realaudio"}, {".rtf", "application/rtf"}, {".sh", "text/plain"}, {".tar", "application/x-tar"}, {".tgz", "application/x-compressed"}, {".txt", "text/plain"}, {".wav", "audio/x-wav"}, {".wma", "audio/x-ms-wma"}, {".wmv", "audio/x-ms-wmv"}, {".wps", "application/vnd.ms-works"}, {".xml", "text/plain"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, {"", "*/*"} };