时间:2021-05-21
两个小解释:
FileProvider是ContentProvider特殊的子类,ContentProvider通过创建content:// Uri来替代file:/// Uri。
在Android 7.0的以上的系统中,尝试传递file://URI可能会触发FileUriExposedException
FileProvider的这个概述包括以下主题:
1.定义FileProvider
2.指定可用文件
3.检索文件的Content URI
4.授予URI的临时权限
5.将内容URI提供给其他应用程序
第一步:定义FileProvider:
//清单文件中 <provider android:name="android.support.v4.content.FileProvider"//固定 android:authorities="${applicationId}.yourname"//根据您控制的域将属性设置为URI权限 android:exported="false"//FileProvider不需要公开 android:grantUriPermissions="true">//允许您授予对文件的临时访问权限 ...</provider>第二步:指定可用文件
//新建一个xml文件用于存放应用需要共享的目录文件//以下paths元素告诉FileProvider您打算为images/私有文件区域的子目录请求内容URI<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> ...</paths>该元素必须包含一个或多个以下子元素:
//代表内部存储空间应用私有目录下的 files/ 目录,等同于 Context.getFilesDir() 所获取的目录路径;<files-path name = “ name ” path = “ path ” />//代表内部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getCacheDir() 所获取的目录路径;<cache-path name = “ name ” path = “ path ” />//代表外部存储空间根目录,等同于 Environment.getExternalStorageDirectory() 所获取的目录路径;<external-path name = “ name ” path = “ path ” />//代表外部存储空间应用私有目录下的 files/ 目录,等同于 Context.getExternalFilesDir(null) 所获取的目录路径;<external-files-path name = “ name ” path = “ path ” />//代表外部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getExternalCacheDir();<external-cache-path name = “ name ” path = “ path ” />//代表外部媒体区域根目录中的文件。等同于Context.getExternalMediaDirs()。<external-media-path name = “ name ” path = “ path ” />这些子元素都使用两个相同的属性:
name="name"
一个URI路径段。 用于给 path 属性所指定的子目录名称取一个别名 为了提高安全性,此值将隐藏您要共享的子目录的名称。该值的子目录名称包含在该 path属性中。
path="path"
你正在分享的子目录。虽然该name属性是一个URI路径段,但该path值是实际的子目录名称。请注意,该值是指一个子目录,而不是独立文件名。您无法通过文件名共享单个文件,也无法使用通配符指定文件的子集。
第三步:检索文件的 Content URI
//使用 FileProvider 类提供的公有静态方法 getUriForFile 生成 Content URI//第一个参数:context上下文//第二个参数: Manifest 文件中注册 FileProvider 时设置的 authorities 属性值//第三个参数:要共享的文件,并且这个文件一定位于第二步我们在 path 文件中添加的子目录里面Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".myprovider", myFile);第四步:授予URI的临时权限
授权方式有两种:
第一种方式:
//调用方法://参数1:授权访问 URI 对象的其他应用包名//参数2:授权访问的 Uri 对象//参数3:授权类型FLAG_GRANT_READ_URI_PERMISSION 或者 FLAG_GRANT_WRITE_URI_PERMISSION (或者二者同时授权。这种形式的授权方式,权限有效期截止至发生设备重启或者手动调用 revokeUriPermission() 方法撤销授权时)grantUriPermission(package, Uri, mode_flags)第二种方式:
//配合intent使用//权限有效期截止至其它应用所处的堆栈销毁,并且一旦授权给某一个组件后,该应用的其它组件拥有相同的访问权限。Intent.setFlags() 或者 Intent.addFlags()Intent.setData(Uri uri);第五步:将内容URI提供给其他应用程序
//通过以下方法启动其他应用并传递授权过的 Content URI 数据。当然,也有其他方式提供服务。startActivity()或者
或者
官方原文(需要自备梯子,想自己搭的教程点击这里): Google Develpers - FileProvider
以下是一个我这边的例子:
场景:版本更新完成时打开新版本 apk 文件实现自动安装
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android7.0行为变更FileUriExposedException解决方法当我们开发关于【在应用间共享文件】相关功能的时候,在Android7.0上经常
Android安装apk文件并适配Android7.0详解首先在AndroidManifest.xml文件,activity同级节点注册provider:将ap
前言#Android7.0已经发布很久了,虽然市场份额还不是很高,但是流行起来都是早晚的事,所以适配Android7.0刻不容缓。Android7.0对系统进行
前言Android7.0系统发布后,拿到能升级的nexus6P,就开始了7.0的适配。发现在Android7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些
Android7.0调用相机崩溃解决办法错误提示:android.os.FileUriExposedException:file:///storage/emul