7.0以上的设备自动安装apk时报错问题修复

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:49   1633   0

备注:(该问题出现在大多数10.0设备,8.0、9.0设备测试正常)

  • 第一次报错:android.content.ActivityNotFoundException:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW type=application/vnd.android.package-archive flg=0x10000000 }

报错图片:

问题分析:

android框架使用StrictMode Api禁止我们的应用对外部(跨越应用分享)公开file://,若使用file://格式共享文件则会报FileUriExposedException异常,android 7.0应用间的文件共享需要使用content://类型的URI分享,并且需要为其提供临时的文件访问权限
(Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION),对此,官方给我们的建议是使用FileProvider类进行分享。

解决方案:

(1)添加file_path.xml配置文件

2在AndroidManifest.xml文件中添加FileProvider,并配置file_paths文件

3)安卓7.0以上设备需要判断,使用FileProvider.getUriForFile获取文件路径

  • 第二次报错:解析软件包时出现问题

报错信息:

java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://包名.fileProvider/external_storage_root/app-client.apk from pid=5613, uid=10054 requires the provider be exported, or grantUriPermission()

问题分析:

在安装时URI路径错误 或 安装时杀死了进程(我的原因是安装前杀死了应用进程导致),排查下具体原因修复即可。

参考文章:FileProvider被禁止访问报解析包错误

例如:Activity.finish();KillProcess();System.exit(0);

问题截图:

第三次报错:未知来源应用安装权限

由于 getPackageManager().canRequestPackageInstalls();只有在编译版本为8.0时才能使用,且必须是目标版本为8.0以上才能正确获取。

报错截图:

解决方案:

添加Android8.0 允许安装未知来源权限即可。

参考文章:

未知来源应用安装权限决绝方法

       //兼容8.0
        boolean installAllowed;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            installAllowed = context.getPackageManager().canRequestPackageInstalls();
            if (installAllowed) {
                installApk(file);
            } else {
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + context.getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                installApk(file);
                return;
            }
        } else {
            installApk(file);
        }

    //安装apk,兼容7.0
    protected void installApk(File file) {
        if (!file.exists()) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        // setFlags需要放到addFlags 之前否则不生效
        // 由于没有在Activity环境下启动Activity,设置下面的标签
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //版本在7.0以上是不能直接通过uri访问的
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //参数1 上下文, 参数2 Provider主机地址和清单文件中保持一致   参数3 共享的文件
            Uri apkUri =
                    FileProvider.getUriForFile(context, "com.xxx.fileProvider", file);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file),
                    "application/vnd.android.package-archive");
        }
//        intent.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
       
        context.startActivity(intent);
    }

修复三个问题后,apk安装问题全部修复,可以正常安装使用。

ps:本文内容为个人遇到的问题修复经历,文笔水平有限,如有遗漏或错误请及时提出~

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP