最近做公司APP(更新软件)调用外部文件时爆出了FileUriExposedException异常,刚开始以为是自己编写出错,但是调过几次之后发现不是,结合大神和官方文档终于整明白其原因所在。
1,Android 7.0 及其以上版本对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的Uri访问。
什么时候会用到Uri的应用外访问呢?比如实现开发APP更新时,这个时候会调用系统功能来安装这个apk,这就是应用外访问文件,需要传入文件的Uri。
但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以Android 7.0及以上版本对应用外访问的Uri要进行处理加密。话不多说直接上代码。
2,又到了产品经理和同事对你惊讶的时刻了,一分钟解决FileUriExposedException异常:
首先在AndroidManifest文件中注册
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- //临时访问文件的注册-->
//======================ctrl+c区域===================================
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.lipuwulian.blesample.provider"//自己包名加.provider
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
//======================ctrl+c区域===================================
<activity android:name="com.lipuwulian.blesample.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
在res文件夹下创建xml文件夹、
file_paths文件里的内容:path是data/包名加.testapplication/
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="files_root"
path="Android/data/com.lipuwulian.blesample.testapplication/" />
<external-path
name="external_storage_root"
path="." />
</paths>
</resources>
配置完之后就把项目中的
File file = new File(path);
Uri.fromFile(file)或者Uri.parse(file)变成
FileProvider.getUriForFile(context.getApplicationContext(),
“com.lipuwulian.blesample.provider”, file);
如果想学习如何实现微信分享的话,可以去我的下一篇一分钟让你实现Android微信分享功能
到这里就结束了,希望能够帮到大家哦!IT需要爱与和平😊,最后请大家关注我,以及我的一分钟系列(Android篇和小程序篇)让你一分钟实现相应的功能,成功引起产品经理的注意袄。