美文网首页程序猿阵线联盟-汇总各类技术干货我爱编程
Android 8.0 下载安装进入【安装未知应用】页面,两步简

Android 8.0 下载安装进入【安装未知应用】页面,两步简

作者: 阿策神奇 | 来源:发表于2018-04-12 16:04 被阅读574次

          小菜昨天接到客户反馈的问题,说华为手机升级到 Android 8.0 系统以后,程序升级下载之后不能安装;找一个手机测试果然如此,每次下载完之后不跳转安装页面,重新进入程序又继续下载,之后依旧不跳转安装页面,再次进入循环...流程自然欠妥,但发现问题主要还是 Android8.0 权限管理的问题。
          在 Android 8.0 系统中,未知来源应用不可直接安装,跳转到的是未知来源应用管理列表,如果需要安装,则需要手动授权"安装未知应用"。


          网上大神们解决方案很多,基本一致,但小菜尝试发现每次安装跳转到【安装未知应用列表】页面,之后找到相应的应用,进入【安装未知应用】页面,再手动允许安装应用,小菜想弹框提醒一步允许安装,尝试如下:

    1. 权限添加,在 AndroidManifest.xml 清单文件中,添加如下权限;
    <users-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    
    1. 在【打开安装包】的代码中添加兼容 Android 8.0 的代码判断;
    private void notifyToInstall() {
        if (!StringUtils.isBlank(apkPath)) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            // 由于没有在Activity环境下启动Activity,设置下面的标签
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
                //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致  参数3  共享的文件
                Uri apkUri =
                FileProvider.getUriForFile(context, "com.founder.newaircloud.fileprovider", new File(apkPath));
                //添加这一句表示对目标应用临时授权该Uri所代表的文件
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
                //兼容8.0
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
                    if (!hasInstallPermission) {
                        Intent intent2 = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
                        intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        activity.startActivityForResult(intent2, 100);
                        return;
                    }
                }
            } else {
                intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
            }
            activity.startActivity(intent);
        }
    }
    
    安装未知应用列表页面 安装未知应用页面
    1. 在回调过程中添加一个状态,activity.startActivityForResult(intent2, 100); apkUrl 为下载到本地手机的 apk 路径,接收之后直接安装 apk;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100) {
            if (!StringUtils.isBlank(mCache.getAsString("apkUrl"))) {
                installApk(mCache.getAsString("apkUrl"));
            }
        }
    }
    //安装应用
    private void installApk(String apkUrl) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            intent.setDataAndType(Uri.fromFile(new File(apkUrl)),
                    "applicationnd.android.package-archive");
        } else {//Android7.0之后获取uri要用contentProvider
            Uri apkUri =
                    FileProvider.getUriForFile(context, "com.founder.chenbaoxinjiang.fileprovider", new File(apkUrl));
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "applicationnd.android.package-archive");
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getBaseContext().startActivity(intent);
    }
    
    合并为一步,允许安装

          小菜的解决方法就是如此,希望以后大家对每次 Android 大版本更新的升级变更内容多做了解!

    相关文章

      网友评论

        本文标题:Android 8.0 下载安装进入【安装未知应用】页面,两步简

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