看我如何解决“包解析错误”问题

本文讲述了作者在解决Android中的'包解析错误'过程中,遇到的问题及解决方案。从7.0到8.0,Google对FileProvider的使用策略进行了改变,需要正确设置provider的exported属性和grantUriPermissions,以及适配不同版本系统的安装APP方法。通过梳理和实践,最终在Android 8.0系统上成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//getExternalCacheDirs()

既然了解了,我指定的也是没有毛病啊,但是还是不行,我重新看了下报错信息,发现报错信息中有

that is not exported

是不是在provider中exported的参数设置问题,感觉找到了希望,我急忙去改这个参数,运行程序,噢噢,直接崩溃了。这是什么鬼。看下日志:

java.lang.SecurityException: Provider must not be exported

大概的意思就是不能设置为exported为true,看来问题还是没有找到。

我重新梳理下,安装APP的适配问题,fileprovider适配其实分三个阶段,

分6.0之前,7.0和7.0之后,也就说在7.0之前根本不需要使用FileProvider, 在6.0之前直接使用

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri.fromFile(new File(installPath)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

就可以了,但是到了7.0,Google改变了策略,就需要使用FileProvider,

Intent intent = new Intent();
Uri uri = null;
uri = FileProvider.getUriForFile(context, context.getPackageName()+“.fileprovider”, new File(filesPath));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);



authorities:app的包名.fileProvider

grantUriPermissions:必须是true,表示授予 URI 临时访问权限

exported:必须是false 否则会报上面的错误

resource:中的@xml/file_paths是我们接下来要添加的文件,具体怎么写,可以参考上面的写法

在8.0及8.0以上的Google又做了改变,我靠。安装APP时,还需要将APP拷贝到context.getFilesDir()这个目录下,但是仍然需要fileprovider,代码如下:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addCategory(“android.intent.category.DEFAULT”);
Uri contentUri = FileProvider.getUriForFile(context, “com.iflytek.appstroe2.fileprovider”, new File(dstPath));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(contentUri, context.getContentResolver().getType(contentUri));
List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
context.grantUriPermission(resolveInfo.activityInfo.packageName, contentUri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
context.startActivity(intent);
到此算是梳理清楚了,但是我问题还是没有解决。我看了下我的系统版本,发现尼玛是Android 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 8.0的,但是我一直在搞Android7.0的,我按照Android 8.0的方法试了下,发现可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值