Android版本更新弹框,内部包括:强制/非强制更新、内部下载(适配8.0以上)/跳转浏览器下载安装,等等相关功能

Android8.0之前
未知应用安装权限默认开启,如下图所示
Android8.0之后
未知应用安装权限默认关闭,且权限入口隐藏。

1.如何开启未知应用安装权限的入口,并设置允许安装?
在AndroidManifest清单文件中添加权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
2.如果为8.0以上系统,则判断是否有未知应用安装权限

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Uri packageURI = Uri.parse("package:" + activity.getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
            new ActResultRequest(activity).startForResult(intent, new ActForResultCallback() {
                @Override
                public void onActivityResult(int resultCode, Intent data) {
                    Log.i(TAG, "onActivityResult:" + resultCode);
                    if (resultCode == RESULT_OK) {
                        //用户授权了
                        if (installPermissionCallBack != null) {
                            installPermissionCallBack.onGranted();
                        }
                    } else {
                        //用户没有授权
                        if (installPermissionCallBack != null) {
                            installPermissionCallBack.onDenied();
                        }
                    }
                }
            });
        } else {
            //用户授权了
            if (installPermissionCallBack != null) {
                installPermissionCallBack.onGranted();
            }
        }

3.如果没有未知应用安装权限,则需要手动开启

    /**
     * 判断有没有安装权限
     * @param context
     * @return
     */
    public static boolean hasInstallPermission(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //先获取是否有安装未知来源应用的权限
            return context.getPackageManager().canRequestPackageInstalls();
        }
        return true;
    }

4.然后根据用户是否授权,做对应处理。

    private void installApk(String path) {
        InstallUtils.installAPK(this, path, new InstallUtils.InstallCallBack() {
            @Override
            public void onSuccess() {
                //onSuccess:表示系统的安装界面被打开
                //防止用户取消安装,在这里可以关闭当前应用,以免出现安装被取消
                ActivityQueueManager.getInstance().finishAllActivity();
//                android.os.Process.killProcess(android.os.Process.myPid());
                CustomToast.showToast(R.string.installing_apk);
            }

            @Override
            public void onFail(Exception e) {
//                LogSaveUtils.addLog("10006","安装失败");
                LogUtil.d("ttt","installApk onFail e = " + e.getMessage());
                CustomToast.showToast(R.string.install_failed);
                CommonUtil.openBrowser(SplashActivity.this, updateApkUrl);
            }
        });
    }
    /**
     * 安装APK工具类
     *
     * @param context  上下文
     * @param filePath 文件路径
     * @param callBack 安装界面成功调起的回调
     */
    public static void installAPK(Activity context, String filePath, final InstallCallBack callBack) {
        try {
            MNUtils.changeApkFileMode(new File(filePath));
            Intent intent = new Intent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction(Intent.ACTION_VIEW);
            File apkFile = new File(filePath);
            Uri apkUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                // 授予目录临时共享权限
//                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
//                String authority = context.getPackageName() + ".updateFileProvider";
//                apkUri = MNUpdateApkFileProvider.getUriForFile(context, authority, apkFile);
                //android适配android10安装
                apkUri = FileProvider.getUriForFile(context, "com.yoka.tablepark.fileProvider", apkFile); //与manifest中定义的provider中的authorities="com.yoka.tablepark.fileProvider"保持一致
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            } else {
                apkUri = Uri.fromFile(apkFile);
            }
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            new ActResultRequest(context).startForResult(intent, new ActForResultCallback() {
                @Override
                public void onActivityResult(int resultCode, Intent data) {
                    Log.i(TAG, "onActivityResult:" + resultCode);
                    //调起了系统安装页面
                    if (callBack != null) {
                        callBack.onSuccess();
                    }
                }
            });

        } catch (Exception e) {
            if (callBack != null) {
                callBack.onFail(e);
            }
        }
    }

完整代码在 Github : https://github.com/jeffreyxuworld/APPUpdateVersion

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android版本差异适配方案(5.0-9.0) 一个好的APP最好支持90%设备,由于不同版本系统提供的API可...
    yinhaide阅读 3,547评论 4 32
  • 之前项目targetSdk基于Android6.0即API版本号为23进行开发,现在需要升级到9.0,期间跨越了好...
    Steven_SHH阅读 1,272评论 1 12
  • Android6.0至9.0版本适配总结 简要列举下Android6到Android9在开发中需要适配的问题,做到...
    Showdy阅读 1,906评论 0 2
  • 未来市场空间大,朝阳产业 电动汽车:比亚迪 云业务: 垃圾处理: 医疗: 机器人 保险:平安 银行:工行、招行
    doublestar123阅读 155评论 0 0
  • 夜色和烟火,你总要选择一个。 一个是人间的静谧,一个是人间的喧闹。 就像梦与生活,你总要爱一个而辜负一个。
    春和景明啊阅读 195评论 0 3

友情链接更多精彩内容