前言
在安卓7.0之后的系统中,我们想从文件中获取Uri必须使用FileProvider,这点相信大家都知道。使用FileProvider来进行安卓7.0及以上的系统的适配时,我们要先在清单文件里加入如下配置:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${JPUSH_PKGNAME}.FileProvider"
android:exported="false"
tools:replace="android:authorities"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
这里有两个需要注意的点,一旦搞错就会崩溃。
注意点
1.android:authorities
这个字段是包名+"."+自定义的FileProvider名称,authorities一定要与代码中调用的名称一致,见以下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(_mActivity, BuildConfig.APPLICATION_ID + ".FileProvider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
}
else
...
2.android:resource
这个字段指向一个xml的路径,此xml申明文件存放的位置。如果有多个xml需要配置(比如有的照片选择库需要配置android:resource,再比如融云即时通讯也需要配置android:resource),那么我们就需要对两种xml的内容进行合并,让App使用的FileProvider的path都是一样的(即不同Module引用的xml可以不一样,但里面的内容要一样,因为都是给主Module使用的)。