在 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. ArrayList的内存泄露
  2. 未能创建Microsoft Visual C# 2008 编译器 解决方案【轉】
  3. VideoTool之FFmpeg:FFmpeg的简介、安装、使用方法之详细攻略
  4. 文青工程师陈盛 — 程序员+文青是怎样一种体验
  5. ajax传递map参数给后端
  6. mysql replace 不区分大小写_mysql 不区分大小写的解决
  7. zabbix客户端安装配置
  8. (@WhiteTaken)设计模式学习——代理模式
  9. PyTorch学习—11.权值初始化
  10. JS递归算法经典案例与分析
  11. 2022.08 VMware官网下载安装+配置Linux虚拟机,最新最全
  12. 编写测试报告,及测试报告模板
  13. el-input隐藏边框
  14. 笔记本连接老式显示器(VGA线+HDMI接口)
  15. python查询mysql decimal报错_【2020Python修炼记】MySQL之 表相关操作
  16. 怎样将pdf文件页面旋转
  17. 深度学习LSTM框架图PPT高清
  18. 记:数据库课程设计(一)
  19. 请收下这份秘籍: 这里有关于申请 gTech 职位所需知道的一切
  20. 第四届橙瓜网络文学奖暨见证·网络文学20年评选年度奖项结果揭晓

热门文章

  1. java wrapper怎么运行_wrapper简单使用
  2. python简单工厂模式_python版简单工厂模式
  3. Attention U-Net: Learning Where to Look for the Pancreas
  4. 2019年北京画室排名前十位(北京服装学院方向)
  5. 总结GLM库中glm::transform(位移), glm:scale(缩放), glm::rotate(旋转)
  6. 吃粽子html5游戏,端午吃粽子玩游戏 这些手机玩游戏不错
  7. 总裁演说思维:如何学会说话随机应变
  8. 你以为在用SharePoint但其实不是
  9. 使用vite打包时候遇到的坑
  10. Redis 一致性hash、hash槽