android.os.FileUriExposedException 报错问题的解决

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.

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留白的云

感谢鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值