概述:
从Android 7开始,将不允许在app之间,使用file uri,即file://的方式,传递一个file,否则会抛出异常:FileUriExposedException ,其解决方案,就是使用FileProvider,用content://代替file://,同时需要将targetSdk,升级到24。主要用于系统相机拍照及图片裁剪、应用之间数据访问、应用的升级等。
普通应用中使用
-
创建FileProvider,继承自FileProvider,这里我用的androidx.core.content.FileProvider
-
创建file_paths.xml
详细相关配置,可查看fileprovider官网
-
在AndroidManifest中,配置provider,以及file_paths
-
使用,这里我们已app升级为例
系统应用中使用,就是加了:android:sharedUserId=“android.uid.system”
会发现报异常如下:
会发现这样一条警告日志:
UriGrantsManagerService:ActivityManager: For security reasons, the system cannot issue a Uri permission grant to **** use startActivityAsCaller() instead
,原因是Android 11 ,限制了系统应用对fileProvider的使用,看一下源码,是不是似曾相识:
注意这里,源码位置,我这边是MTK Android 11的源码,位置不同,是在uri下的 UriGrantsManagerService.java中,而且方法名是checkGrantUriPermissionUnlocked(),并非在AMS中
可以看到,假如我们的app,是系统app或者root app,并且提供的uri的authority不是,“com.android.settings.files”时,打印上述的警告,并返回-1。
修改:
这里我们添加一个条件,可以直接添加我们fileprovider对应的包名