android.os.FileUriExposedException 小米手机升级完系统以后原来的拍照不能用了。分享功能也不能用了。
综上所述都是由于小米手机自动升级到andorid7.0系统以后,引入“私有目录被限制访问”,“StrictMode API 政策”导致的问题。解决办法很简单。就是用新的方式获取uri。
” StrictMode API 政策” 是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。
使用FileProvider来解决问题。
1、在AndroidManifest.xml 清单文件中加入provider。
<!-- android 7.0临时赋予访问权限 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="ccbchecklist.meiaomie.com.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
注意上面:
exported
:要求必须为false,为true则会报安全异常。grantUriPermissions:true
,表示授予 URI 临时访问权
限。authorities
组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。
2、在res目录下新建一个xml文件夹。名字和清单文件中的名字一致。叫filepaths。
内容如下 <?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path path="." name="ccb_xls" /> </paths> </resources> 注意: •path:需要临时授权访问的路径(.代表所有路径) •name:就是你给这个访问路径起个名字-
- 代表的根目录:Context.getFilesDir()
- 代表的根目录: Environment.getExternalStorageDirectory()
- 代表的根目录: getCacheDir()
3、改完这两处以后,就在代码里改了。
下面是报错的代码:
Intent share = new Intent(Intent.ACTION_SEND); Log.e("ShareUtils", "shareFile: " + file.getPath()); share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
修改为:
Intent share = new Intent(Intent.ACTION_SEND); Log.e("ShareUtils", "shareFile: " + file.getPath()); Uri uri=FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileProvider",file); share.putExtra(Intent.EXTRA_STREAM, uri);
此处加粗的字体。将uri获取的方式改为FileProvider的方式。
拍照的时候。报错这个错误。android.os.FileUriExposedException获取图片file的文件uri的方式也改为FileProvider获取的方式。
但凡报这个错误就是Uri获取方式的问题。大家注意改一下uri的获取方式就ok.