android.os.FileUriExposedException:
1.前段时间,项目刚刚上线,然后,大家懂得--各种7.0崩溃
2.然后这个问题搞定了,下一个项目的时候7.0这个问题对吧,肯定得解决。然后复制,粘贴。 砰....崩溃
下面是我自己解决这两个问题的方法,分享给大家(百度上面也有,我自己想自己遇到的还是得积累积累)
报错原因:android7.0对于系统权限作了一些更改,为了提高私有文件的安全性,当我们在访问文件的时候,安卓禁止您的应用外部公开file://uri
解决思路:需要在应用之间共享文件,那就少不了FileProvider类
第一步 在清单文件下注册
<provider android:name="android.support.v4.content.FileProvider" //此处的provider需要和代码中的provider保持一致 android:authorities="你的包名.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
第二步 res/xml/provider_paths类
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="" /> <external-path name="files_root" path="Android/data/你的包名/download/"/> </paths>
(第一个path是我用来解决7.0权限的,第二个是用于更新的)第三步 在代码中将Uri.fromFile替换if (Build.VERSION.SDK_INT >= 24) { uri = FileProvider.getUriForFile(this,"你的包名.provider", file); } else { uri = Uri.fromFile(file); }
更新部分private void installApk(Context context, File file) { Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), "packagename.provider", file); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } context.startActivity(intent); }
就是这么简单哈,但是注意几个问题1 provider需要保证它的唯一性,即在不同的app里面需要使用不同的名称建议项目名+provider2 如果你两个项目使用了同一个provider,真机上根本无法装载哦3 注意你的代码里面的provider名字需要和清单的provider名字一致,否则会报空