文章目录

  • 一. 问题: 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()相关推荐

  1. android编译apk报错,android studio 编译出的apk安装报错 “应用是非正式发布版本,...

    Android开发--自定义控件 Android开发--自定义控件 一.创建一个XML布局文件用于存放自定义控件的布局 layout_item.xml ?xml version=1.0 encodin ...

  2. 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 ...

  3. cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录

    cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录 cmake 没有那个目录 - 未完代码 - 博客园 因为直接使用cma ...

  4. 安装perf后,执行perf命令报错。

    系统版本: deepin 下安装perf 按道理来说,咱们通过apt install 安装好之后是可以直接运行perf 命令了,但是.... deepin 安装perf 后,执行perf命令报错: 此 ...

  5. 安装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_ ...

  6. Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案

    如果在AndroidStudio调试安装程序时,如果程序中没有Activity的代码文件的话可能会在程序部署到手机或虚拟机上时碰到"Error running app: Default Ac ...

  7. linux mysql scripts_linux安装mysql时执行scripts/mysql_install_db报错如何解决?

    展开全部 linux安装mysql时执行scripts/mysql_install_db报错这样解决: 1.检查下当前目录是什636f707932313133353236313431303231363 ...

  8. docker windows 安装 报错 Component CommunityInstaller.AutoStartAction failed: 尝试执行未经授权的操作

    问题描述: docker windows 版本安装报错. Component CommunityInstaller.AutoStartAction failed: 尝试执行未经授权的操作. 详细报错: ...

  9. [安装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 ...

最新文章

  1. 客服团队OKR怎么写?看最新客服OKR模板
  2. 按下电源后的几秒钟,CPU 在干嘛?
  3. css考核点整理(十一)-响应式开发经验,响应式页面的三种核心技术是什么
  4. 新安装和已安装nginx如何添加未编译安装模块/补丁
  5. 玩Docker只要浏览器就够了,PWD是个神奇的网站
  6. 微软高管解读财报:努力创新云基础架构
  7. MySQL在Docker环境下运行基础
  8. 自然语言处理的几个困难
  9. 大型网站首页执行时间0.3秒,性能算好还是算坏?
  10. 怎样测试通达信软件,最全图文讲解——通达信电脑版和手机版指标安装方法
  11. win10系统QQ音乐安装包无法打开解决方法!
  12. Android twrp+adb 完美免费救砖 安装系统教程 亲测有效
  13. SAP 生产成本明细报表
  14. 聚焦新生代 戮默科技创造正向价值
  15. html仿QQ资料卡,JS实现的模仿QQ头像资料卡显示与隐藏效果
  16. 考研词汇 用语言记忆
  17. 搭建基于 Vim 的 C++和 Python 开发环境[持续更新]
  18. linux环境下如何重装系统,linux 怎么重装系统?
  19. 腾讯滑块识别-通用滑块识别
  20. 计算机教师帮扶记录,教师结对帮扶工作总结范文(通用6篇)

热门文章

  1. 系统升级前的优质软件备份目录
  2. 转:史上最强软件攻城师面试题
  3. java图形界面制作表格,Java自学-图形界面 表格
  4. 算法工程师、软件工程师、大数据工程师的区别
  5. ASP.NET Core入门级教程_上篇
  6. 30页PPT下载 |《传媒行业:把握产业新趋势,持续布局5G应用端》
  7. Android分区简介
  8. 手机浏览器被黑_我的手机被黑了,这就是保护自己的方法
  9. Java中String转int类型出现的问题及解决方式
  10. EdgeGallery开源一周年:在风起云涌的边缘计算时代独立潮头