标签:uri ima googl 详解 support pac 包含 directory 路径
Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。原因在于使用file://Uri会有一些风险,比如:
file://Uri
的app无法访问该文件。READ_EXTERNAL_STORAGE
权限,在读取文件时会引发崩溃。因此,google提供了FileProvider
,使用它可以生成content://Uri
来替代file://Uri
。
AndroidManifest.xml
中添加providerFileProvider.getUriForFile
()方法获得Url
在 res/xml 目录下新建一个 xml 文件,用于存放应用需要共享的目录文件。这个 xml 文件的内容类似这样:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="cam" path="images" /> </paths>
可以看出,这五种子元素基本涵盖内外存储空间所有目录路径,包含应用私有目录。同时,每个子元素都拥有 name 和 path 两个属性。其中,path 属性用于指定当前子元素所代表目录下需要共享的子目录名称。注意:path 属性值不能使用具体的独立文件名,只能是目录名。而 name 属性用于给 path 属性所指定的子目录名称取一个别名。后续生成 content:// URI 时,会使用这个别名代替真实目录名。这样做的目的,很显然是为了提高安全性。如果我们需要分享的文件位于同级别目录下不同的子目录中,就需要添加多个子元素逐一指定要分享的文件目录,或者共享他们通用的父目录也行。
不同的app可能会有要求不同的共享目录,这个要求的共享目录可以在报错里找到,添加对应的报错路径即可.
AndroidManifest.xml
中添加provider<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.yt.demo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/yourfilename" /> </provider>
请注意authorities这行,需要添加你的包名 加 后缀
FileProvider.getUriForFile
()方法获得Url例子代码如下:
String filePath = Environment.getExternalStorageDirectory() + "/images/"+System.currentTimeMillis()+".jpg"; File outputFile = new File(filePath); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdir(); } Uri contentUri = FileProvider.getUriForFile(this, getPackageName()+".fileprovider", outputFile);
Android 开发 关于7.0 FileUriExposedException异常 详解
标签:uri ima googl 详解 support pac 包含 directory 路径
原文地址:https://www.cnblogs.com/guanxinjing/p/10606620.html