在 Android 7.0  ( N ) 以后调用调用相册、照片、安装 APK 等等都会有可能遇到异常 android.os.FileUriExposedException

记得之前有处理过这个问题,今天在安装 APK 时,也遇到以为比较简单,可以快速解决。没想到一天都困在这个 bug 上了(后面讲原因)。经过今天大量的搜索资料,算是系统的学习了一遍这个知识点了吧。

一、在 Android 7.0 以上,对于应用间共享文件做了强制要求。

  • 对于面向 Android N 的应用,Android 框架执行的 StrictMode,API 禁止向您的应用外公开 file://URI。如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 FileUriExposedException异常。

  • 若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。

二、使用方法

  • 在 AndroidManifest.xml 中添加 provider
     <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider>
  • 创建 XML 文件,如:filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><root-path name="root" path="" /><files-path name="files" path="." /><cache-path name="cache" path="." /><external-path name="external" path="." /><external-files-path name="name" path="path" /><external-cache-path name="name" path="path" />
</paths>
  1. files-path :Context.getFilesDir()
  2. cache-path:getCacheDir()
  3. external-path:Environment.getExternalStorageDirectory()

参考:

    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk--><external-path name="beta_external_path" path="Download/"/><!--/storage/emulated/0/Android/data/${applicationId}/files/apk/--><external-path name="beta_external_files_path" path="Android/data/"/>

其中 path = "." 表示所有的目录。

经过一顿乱写之后,从下午一直到晚上,最后旁边的同事都走完了才发现,原来是在调用跳转的方法和调用跳转的地方不是同一个方法,应该一手封装了一个工具类方便调用,后面维护的同事不知道原本写有了,还把代码复制粘贴原本到那个地方,而且这个还不容易找到。唉,心真累。尤其是修改别人的代码。不过我也粗心,看文档,没看代码导致浪费了很多时间。

Uri 获取需要做判断,我这里是调转安装:

   File file = new File(apkPath);Uri uri;if (Build.VERSION.SDK_INT >= 24) {uri = getUriForFile(context, context.getPackageName() + ".fileProvider", file);context.grantUriPermission(context.getPackageName(), uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);} else {uri = Uri.fromFile(file);}Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |             Intent.FLAG_GRANT_WRITE_URI_PERMISSION);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(uri,"application/vnd.android.package-archive");context.startActivity(intent);android.os.Process.killProcess(android.os.Process.myPid());

ps:最近在集成某语音 SDK 时,遇到一个小坑。

由于内部直接定义了 authorities 并且是写死的,这时会出现安装异常问题了。

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER: Package couldn't be installed in /data/app/com.xxxxx-E4rQAls5E5bmlUawI12PAg==: Can't install because provider name com.xxx.xx.x.mobilesdk.com.xxx.ting.httpclient (in package com.xxx.xx) is already used by com.xxx.xx.x]

因为系统会检测到手机本身已经有了这个 provider 了。所以命名的时候最好是跟随包名变化。

android:authorities="${applicationId}.fileprovider"

关于 FileProvider(应用间共享文件)的一点总结相关推荐

  1. Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

    本文转自张鸿洋的博客 http://blog.csdn.net/lmj623565791/article/details/72859156 一.概述 之前项目的新特性适配工作都是同事在做,一直没有怎么 ...

  2. android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider

    应用间经常需要将自己的私有文件共享给其他的app,如某应用想要共享图库的图片用来编辑用户的头像,或者文件管理app允许用户在不同目录下复制粘贴文件等等,但为了保护私有文件的安全性,在targetSdk ...

  3. Android手机WIFI与电脑间共享文件

    大家在往手机里传文件的时候是不是还在使用原始的数据线,要不就是使用蓝牙进行传输,数据线传输受到线路和接口的影响,也不是很方便,而且.数据线连接长期使用,易使手机数据口损坏.蓝牙传输又相对较为麻烦,电脑 ...

  4. Vmware与主机间共享文件的七种方法(附图+详解)

    [原创]Vmware与主机间共享文件的七种方法(附图+详解)                       -By:adbrave 相信很多玩电脑的人都用过Vmware吧?(Vmware是虾米东西?倒!

  5. docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  6. VM虚拟机跟主机间共享文件

    VM是常用的虚拟机软件,也是我们封装系统的利器.但经常碰到有朋友在坛子里问关于VM和实机之间交互文件的方法,区区不才,使用VM时间也不长,但稍微有一点经验,抛砖引玉,供大家讨论一下.有写错或者不完整的 ...

  7. linux与windows间共享文件夹 FileZilla树莓派文件传输

    参考:linux与windows间的文件共享 作者:丶PURSUING 发布时间:2021-02-09 11:37:48 网址:https://blog.csdn.net/weixin_4474282 ...

  8. 【转】详细图解Vmware与主机间共享文件的方法

    相信很多玩转电脑技术.测试软件的朋友都在用vmare虚拟机吧?可是,好多人都不知道怎么将主机的文件共享给虚拟机,今天,我就结合自己的一些实际经验给大家分享以下七种方法: 测试环境是: 物理机:笔记本 ...

  9. Vmware与主机间共享文件的七种方法

    先是在深度看到的这个帖子,后来又在VMware看到,才发现后者才是原创,觉得不错,拿来分享 原帖作者:adbrave 原帖地址:http://bbs.vmware.cn/viewthread.php? ...

最新文章

  1. python是什么时候出现的_python什么时候发明的
  2. oracle pde文件导入
  3. VUE基本语法1-插值 属性绑定
  4. SAP CRM IBASE structure的读取逻辑
  5. 这8种SQL用法,我用错吗?求答案!!!
  6. pearson相关系数_Pearson(皮尔逊)相关系数
  7. 清明梦超能力者黄YY、异或树(线段树合并)
  8. 前端获取当前url路径
  9. 双向链表逆置c语言,【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)...
  10. 将S所指的字符串中下标为偶数同时ASCⅡ值为奇数的字符删除,所指串中剩余的字符形成新的串放在t所指的数组中
  11. TCP / IP攻击:ARP缓存中毒的基本原理、TCP序列号预测和TCP重置攻击
  12. 大学计算机基础课学几年,大学计算机基础类课程教学(2017年开始)-杭州师范大学计算机教育与.PDF...
  13. java mvc jquery weui_WEUI 事件绑定
  14. ArcGIS API For JavaScript——空间查询(FindTask和IdentifyTask)
  15. 新版本发布潮:Ceylon 1.2、Node.js 5.0和Atom 1.1
  16. 电商项目java经验_分布式电商系统项目总结
  17. HCIE-Routing Switching V3.0 资料分享
  18. python 换页符_python分页字符串
  19. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
  20. 高德地图API 添加标点 自定义标点

热门文章

  1. love热点多几分优雅气质
  2. 闪信智能督查督办系统
  3. 2021年茶艺师(中级)报名考试及茶艺师(中级)答案解析
  4. 网络学习之'独孤九剑'
  5. 小学教学计算机答辩,小学信息技术《认识计算机》答辩设计
  6. php 统计下载次数,Dedecms下载次数真实统计的实现方法
  7. 当AI邂逅生命健康,华为云为他们搭建三座桥
  8. VIM编辑器配置php语法检测功能
  9. arthas 查看哪个方法调用最耗时_火眼金睛,Java诊断利器Arthas
  10. 万剑归宗:Matplotlib,绘图如此简单