app内执行apk安装报错:exposed beyond app through Intent.getData()
文章目录
- 一. 问题: app内执行apk安装报错:exposed beyond app through Intent.getData()
- 二. 解决方法
- 1. AndroidManifest中增加FileProvider配置
- 2. res目录下新建```xml/filepaths.xml```
- 3 java代码:使用FileProvider兼容安装apk
一. 问题: app内执行apk安装报错:exposed beyond app through Intent.getData()
绝大多数国产Android App都会内置一个更新功能,也就是把新版本的APK放在服务器上,通过接口获取更新信息并下载,然后进行安装。虽然这种行为被Google严厉禁止,但身处这种环境下还是得妥协的。
绝大多数的经验人士都知道以往我们在App内部安装新版本APK的时候,只需要使用非常简单的代码就能实现:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
finish();
startActivity(intent);
其中,file
参数是一个通过APK
文件的地址获取的File
对象,比如你的APK
下载地址是/sdcard/myapp.apk
,则传入new File(“sdcard/myapp.apk”)
。简单粗暴,效果显著。到了Android 7.0
之后,继续沿用这部分代码的时候,就会发现问题了:
android.os.FileUriExposedException: file:///storage/emulated/0/1.apk exposed beyond app through Intent.getData()
FileUriExposedException
字面意思是,文件Uri
暴露的异常
当你的应用把file:// Uri
暴露给其他App的时候就会出现这种异常,因为接收方App可能并不具备访问该共享资源的权限。所以应该用content:// Url
来拓展临时权限,这样接收方就能访问到资源了。显然,这是Google为了收紧Android的自由度,提升安全度所做的事情。
在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI
,并授予 URI
临时访问权限。进行此授权的最简单方式是使用 FileProvider
类,关于FileProvider
使用可以查看:https://blog.csdn.net/u010356768/article/details/89214265
二. 解决方法
1. AndroidManifest中增加FileProvider配置
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="当前包名.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths"/></provider>
AndroidX第一行应变为
android:name="androidx.core.content.FileProvider"
2. res目录下新建xml/filepaths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path name="external" path=“"/>
</paths>
3 java代码:使用FileProvider兼容安装apk
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(apkSavePath);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri uri = FileProvider.getUriForFile(getActivity(), getActivity().getPackageName() + ".fileprovider", apkFile);intent.setDataAndType(uri, "application/vnd.android.package-archive");
} else {intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
startActivity(intent);
其中apkSavePath
,我的程序放到了sd卡下
//获取SD卡的根路径
String sdcardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
final String apkSavePath = sdcardRoot+"/1.apk";
app内执行apk安装报错:exposed beyond app through Intent.getData()相关推荐
- android编译apk报错,android studio 编译出的apk安装报错 “应用是非正式发布版本,...
Android开发--自定义控件 Android开发--自定义控件 一.创建一个XML布局文件用于存放自定义控件的布局 layout_item.xml ?xml version=1.0 encodin ...
- 360加固后walle写入渠道安装报错 Size of APK Signing Block is not a multiple of 4096
安装报错信息 failed to install xx.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES:Failed to collect cer ...
- cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录
cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录 cmake 没有那个目录 - 未完代码 - 博客园 因为直接使用cma ...
- 安装perf后,执行perf命令报错。
系统版本: deepin 下安装perf 按道理来说,咱们通过apt install 安装好之后是可以直接运行perf 命令了,但是.... deepin 安装perf 后,执行perf命令报错: 此 ...
- 安装Phoenix时,执行./splline.py报错File “./sqlline.py“, line 25, in <module> import phoenix_utils File
安装Phoenix时,执行./splline.py报错File "./sqlline.py", line 25, in <module> import phoenix_ ...
- Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案
如果在AndroidStudio调试安装程序时,如果程序中没有Activity的代码文件的话可能会在程序部署到手机或虚拟机上时碰到"Error running app: Default Ac ...
- linux mysql scripts_linux安装mysql时执行scripts/mysql_install_db报错如何解决?
展开全部 linux安装mysql时执行scripts/mysql_install_db报错这样解决: 1.检查下当前目录是什636f707932313133353236313431303231363 ...
- docker windows 安装 报错 Component CommunityInstaller.AutoStartAction failed: 尝试执行未经授权的操作
问题描述: docker windows 版本安装报错. Component CommunityInstaller.AutoStartAction failed: 尝试执行未经授权的操作. 详细报错: ...
- [安装fastfds中的nginx执行make命令报错]src/core/ngx_murmurhash.c:37:11: error
问题 在nginx文件夹里执行make命令报错 src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-We ...
最新文章
- 客服团队OKR怎么写?看最新客服OKR模板
- 按下电源后的几秒钟,CPU 在干嘛?
- css考核点整理(十一)-响应式开发经验,响应式页面的三种核心技术是什么
- 新安装和已安装nginx如何添加未编译安装模块/补丁
- 玩Docker只要浏览器就够了,PWD是个神奇的网站
- 微软高管解读财报:努力创新云基础架构
- MySQL在Docker环境下运行基础
- 自然语言处理的几个困难
- 大型网站首页执行时间0.3秒,性能算好还是算坏?
- 怎样测试通达信软件,最全图文讲解——通达信电脑版和手机版指标安装方法
- win10系统QQ音乐安装包无法打开解决方法!
- Android twrp+adb 完美免费救砖 安装系统教程 亲测有效
- SAP 生产成本明细报表
- 聚焦新生代 戮默科技创造正向价值
- html仿QQ资料卡,JS实现的模仿QQ头像资料卡显示与隐藏效果
- 考研词汇 用语言记忆
- 搭建基于 Vim 的 C++和 Python 开发环境[持续更新]
- linux环境下如何重装系统,linux 怎么重装系统?
- 腾讯滑块识别-通用滑块识别
- 计算机教师帮扶记录,教师结对帮扶工作总结范文(通用6篇)