Android 7.0 以上安装Apk适配方案总结
解决:FileUriExposedException异常:
最近在 Android版本号大于 N的手机上强更 安装Apk时报错,错误信息如下:
android.os.FileUriExposedException: file:///storage/emulated/0/Download/xxxAppName.apk exposed beyond app through Intent.getData()
手机端调用的代码如下:
Intent intentUpdate = new Intent(“android.intent.action.VIEW”);
intentUpdate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri = Uri.fromFile(new File(upgradeMsg.apkpath));
intentUpdate.setDataAndType(apkUri, “application/vnd.android.package-archive”);
startActivity(intentUpdate);
报这个错误主要是应为google在6.0以后的版本做了权限限制, 应用程序 不能直接通过**file://
Uri
向另一个共享资源,需要通过content://
Uris **来共享资源,以便平台可以扩展接收应用程序的临时权限以访问资源。但是N之前的版本还是可以通过 file:// 的方式去共享资源的。
主要原因总结如下:
- 假如共享的文件是私有的,接收file://Uri 的App无法访问文件
- 在Android6.0之后引入运行时权限,如果file://Uri 的app没有申请 Manifest.permission.READ_EXTERNAL_STORAGE权限,在读取文件时 会引发崩溃
解决这种错误的方法google也给出了方案,用FileProvider,它为文件 创建 content://Uri 而不是 file://Uri 来做文件的安全共享。
FileProvider主要步骤:
- 定义FileProvider
- 指定可用文件
- 检索文件内容的URI
- 授权URI临时权限
- 向另一个应用程序提供内容URI
在AndroidManifest.xml中添加如下代码
注意: authorities:app的包名.fileProvider grantUriPermissions:必须是true,表示授予 URI 临时访问权限 exported:必须是false resource:中的@xml/file_paths是我们接下来要添加的文件
在res目录下新建一个xml文件夹,并且新建一个file_paths的xml文件
path:需要临时授权访问的路径(.代表所有路径) name:就是你给这个访问路径起个名字
现在就差修改安装时候的代码了,代码如下:
private void installApk() { //安装程序
Intent intentUpdate = new Intent(“android.intent.action.VIEW”);
intentUpdate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //对Android N及以上的版本做判断
Uri apkUriN = FileProvider.getUriForFile(MainActivity2.this,
MainActivity2.this.getApplicationContext().getPackageName() + “.FileProvider”, new File(upgradeMsg.apkpath));
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了,我自己手头上整理的资料均和上面的答案可免费分享,需要这些资料和答案的朋友,可以点击这里免费领取。
601)。**
[外链图片转存中…(img-Jpo0bqHC-1710757239812)]
[外链图片转存中…(img-KWg7lmQP-1710757239812)]