最近项目中图片选择器的UI定制程度较高,在网上没找到合适的库,于是自己着手写一个
过程中打开相机程序的时候遇到了个问题,系统报错:
android.os.FileUriExposedException:+文件名+ exposed beyond app through ClipData.Item.getUri()
上网查了一下,发现是因为参考了老版的第一行代码...没有对Android7.0以上的情况做适配导致的
FileUriExposedException字面意思是,文件Uri暴露异常,当你的应用把file:// Uri暴露给其他App的时候就会出现这种异常,因为接收方App可能并不具备访问该共享资源的权限。所以应该用content:// Url来拓展临时权限,这样接收方就能访问到资源了。显然,这是Google为了收紧Android的自由度,提升安全度所做的事情
在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要解决这个问题最简单的方法就是使用FileProvider 步骤如下:
1.在AndroidManifest中增加
<provider android:name="androidx.core.content.FileProvider" android:authorities="你的app包名.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
2.res下新建xml/filepaths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external" path=“"/> </paths>
3.将报错获取uri的地方改成以下格式
Uri uri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".filepractivityovider", file);
问题解决。
参考文章https://blog.csdn.net/u010356768/article/details/89212742