我们知道在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获取uri的,android 官网给出的解决办法是通过FileProvider来解决这一问题,我们需要在AndroidManifest.xml 配制provider节点。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="android:resource"/>
</provider>
其中,provider_paths.xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- /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/"/>
</paths>
但是此时我们项目中可能会用到其他一些第三方sdk,为了适配7.0权限也加了fileprovider,此时就会出现冲突问题 : Manifest merger failed,解决这个问题就需要自定义 FileProvide :
第一步:
自定义fileprovider继承fileprovider
image.png
第二步:
自定义xml :千万注意filepath指向的路径也是自定义的,不要和初始file_paths相同
image.png
第三步:
在manidest 加入provider 注意authorities指向的报名是工程project的包名
image.png
网友评论