关于 FileProvider(应用间共享文件)的一点总结
在 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>
- files-path :Context.getFilesDir()
- cache-path:getCacheDir()
- 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(应用间共享文件)的一点总结相关推荐
- Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
本文转自张鸿洋的博客 http://blog.csdn.net/lmj623565791/article/details/72859156 一.概述 之前项目的新特性适配工作都是同事在做,一直没有怎么 ...
- android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider
应用间经常需要将自己的私有文件共享给其他的app,如某应用想要共享图库的图片用来编辑用户的头像,或者文件管理app允许用户在不同目录下复制粘贴文件等等,但为了保护私有文件的安全性,在targetSdk ...
- Android手机WIFI与电脑间共享文件
大家在往手机里传文件的时候是不是还在使用原始的数据线,要不就是使用蓝牙进行传输,数据线传输受到线路和接口的影响,也不是很方便,而且.数据线连接长期使用,易使手机数据口损坏.蓝牙传输又相对较为麻烦,电脑 ...
- Vmware与主机间共享文件的七种方法(附图+详解)
[原创]Vmware与主机间共享文件的七种方法(附图+详解) -By:adbrave 相信很多玩电脑的人都用过Vmware吧?(Vmware是虾米东西?倒!
- docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件
首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...
- VM虚拟机跟主机间共享文件
VM是常用的虚拟机软件,也是我们封装系统的利器.但经常碰到有朋友在坛子里问关于VM和实机之间交互文件的方法,区区不才,使用VM时间也不长,但稍微有一点经验,抛砖引玉,供大家讨论一下.有写错或者不完整的 ...
- linux与windows间共享文件夹 FileZilla树莓派文件传输
参考:linux与windows间的文件共享 作者:丶PURSUING 发布时间:2021-02-09 11:37:48 网址:https://blog.csdn.net/weixin_4474282 ...
- 【转】详细图解Vmware与主机间共享文件的方法
相信很多玩转电脑技术.测试软件的朋友都在用vmare虚拟机吧?可是,好多人都不知道怎么将主机的文件共享给虚拟机,今天,我就结合自己的一些实际经验给大家分享以下七种方法: 测试环境是: 物理机:笔记本 ...
- Vmware与主机间共享文件的七种方法
先是在深度看到的这个帖子,后来又在VMware看到,才发现后者才是原创,觉得不错,拿来分享 原帖作者:adbrave 原帖地址:http://bbs.vmware.cn/viewthread.php? ...
最新文章
- ArrayList的内存泄露
- 未能创建Microsoft Visual C# 2008 编译器 解决方案【轉】
- VideoTool之FFmpeg:FFmpeg的简介、安装、使用方法之详细攻略
- 文青工程师陈盛 — 程序员+文青是怎样一种体验
- ajax传递map参数给后端
- mysql replace 不区分大小写_mysql 不区分大小写的解决
- zabbix客户端安装配置
- (@WhiteTaken)设计模式学习——代理模式
- PyTorch学习—11.权值初始化
- JS递归算法经典案例与分析
- 2022.08 VMware官网下载安装+配置Linux虚拟机,最新最全
- 编写测试报告,及测试报告模板
- el-input隐藏边框
- 笔记本连接老式显示器(VGA线+HDMI接口)
- python查询mysql decimal报错_【2020Python修炼记】MySQL之 表相关操作
- 怎样将pdf文件页面旋转
- 深度学习LSTM框架图PPT高清
- 记:数据库课程设计(一)
- 请收下这份秘籍: 这里有关于申请 gTech 职位所需知道的一切
- 第四届橙瓜网络文学奖暨见证·网络文学20年评选年度奖项结果揭晓
热门文章
- java wrapper怎么运行_wrapper简单使用
- python简单工厂模式_python版简单工厂模式
- Attention U-Net: Learning Where to Look for the Pancreas
- 2019年北京画室排名前十位(北京服装学院方向)
- 总结GLM库中glm::transform(位移), glm:scale(缩放), glm::rotate(旋转)
- 吃粽子html5游戏,端午吃粽子玩游戏 这些手机玩游戏不错
- 总裁演说思维:如何学会说话随机应变
- 你以为在用SharePoint但其实不是
- 使用vite打包时候遇到的坑
- Redis 一致性hash、hash槽