• 在Android7.0的系统上调用系统相机拍照或者进相册,便会出现android.os.FileUriExposedException错误。这是安卓7.0以上版本,做了一些系统权限更改,为了提高私有文件的安全性。禁止在您的应用外部公开 file:// URI,也就是说不能直接在应用间进行文件共享,需要URI 临时访问权限。

  • 在配置文件中加上一个provider

<!-- 如果你的app支持android7.0及以上,那么在android apk的时候临时给app授权访问文件的权限 -->
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="comxf.activity.provider.download"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>
 android:name="android.support.v4.content.FileProvider" --> 使用 FileProvider 类android:grantUriPermissions="true" --> uri访问授权android:exported="false" --> 当前提供者不能被其它应用使用android:name="android.support.FILE_PROVIDER_PATHS" --> 私有文件的路径android:resource="@xml/file_paths" --> 指定私有文件的路径
  • 在res目录下,新建一个xml文件夹,创建一个file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources><paths><external-path name="comxf.activity.provider.download" path="." /></paths>
</resources>
<external-path name="com.xf.activity.provider.download" path="." />name是自己起的,能识别就好了;path表示要共享文件的路径,"."表示所有路径
  • 获取图片的URI,根据不同版本生成相应的URI
    /*** 获取图片的URI,根据不同版本生成相应的URI* @param context* @param file* @return*/private static Uri getUriForFile(Context context, File file) {if (context == null || file == null) {//简单地拦截一下throw new NullPointerException();}Uri uri;if (Build.VERSION.SDK_INT >= 24) {uri = FileProvider.getUriForFile(context, "comxf.activity.provider.download", file);} else {uri = Uri.fromFile(file);}return uri;}
  • 从相机中获取图片
File imageFile;/*** 从相机中获取图片*/protected void getImageFromCamera() {String state = Environment.getExternalStorageState();if (state.equals(Environment.MEDIA_MOUNTED)) {// 如果挂载成功。Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");// 图片路径?照相后图片要存储的位置picPath = getPicName();imageFile = new File(picPath);if (!imageFile.exists()){//getParentFile()方法返回此抽象路径名的父抽象路径名,或如果此路径名没有指定父目录则为null。imageFile.getParentFile().mkdirs();//重要的,,,}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//重要的,,,getImageByCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}// 指定输出路径getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, getUriForFile(PersonnelInformationActivity.this, imageFile));this.startActivityForResult(getImageByCamera, REQUEST_CODE_CAPTURE_CAMEIA);} else {ShowToast("请确认已经插入SD卡");}}
  • 从onActivityResult,中获取图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;}// 判断请求码switch (requestCode) {case REQUEST_CODE_CAPTURE_CAMEIA:// 从相机中获取后返回cropPic(getUriForFile(this, imageFile));break;}
}

  • 裁剪图片
    protected void cropPic(Uri uri) {Intent intent = new Intent();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//重要的,,,intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}intent.setAction("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// mUri是已经选择的图片Uri// 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)intent.putExtra("aspectX", 1);// 裁剪框比例intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 150);// 输出图片大小intent.putExtra("outputY", 150);//裁剪时是否保留图片的比例,这里的比例是1:1intent.putExtra("scale", true);//是否是圆形裁剪区域,设置了也不一定有效intent.putExtra("circleCrop", true);//设置输出的格式intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//是否将数据保留在Bitmap中返回intent.putExtra("return-data", true);startActivityForResult(intent, REQUEST_CODE_CROP);}

  • 值得注意有几个点,上面代码都有注释中都有标出

    • 1,保存图片的路径
    • 2,拍照时,要为7.0以上版本的手机添加一个,临时授权该Uri标记
    • 3,裁剪图片时,也要为7.0以上版本的手机添加一个,临时授权该Uri标记
    • 4,上面3处用这个”comxf.activity.provider.download”,为了防止出错,尽量写相同

Android7.0 发生的android.os.FileUriExposedException错误相关推荐

  1. 安卓7.0报错android.os.FileUriExposedException

    最近在开发过程中遇到了这样一个错误,android.os.FileUriExposedException: file:///storage/emulated/0/xxx/xxx.doc exposed ...

  2. Android7.0解决 android.os.FileUriExposedException: file:///storage/emulated/0/

    解决Android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx 原因: Android N ...

  3. 解决Android7.0系统 调用系统相机、系统播放器播放视频、切图兼容问题,报异常android.os.FileUriExposedException

    原文地址:https://blog.csdn.net/msn465780/article/details/59058088?locationNum=8&fps=1 Android7.0以前获取 ...

  4. 解决 Android N 上报错:android.os.FileUriExposedException: file:///storage/emulated/0/

    解决android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx 原因: Android N ...

  5. Android打开相机,报出 android.os.FileUriExposedException: file:///storage/emulated/0/test/img.jpg exposed

    执行以下代码后,打开相机 //调用相机自带的照相功能 指定图片目录 if (Environment.getExternalStorageState().endsWith(Environment.MED ...

  6. 解决 Android N 7.0 上 报错:android.os.FileUriExposedException

    解决 Android N 上 安装Apk时报错:android.os.FileUriExposedException: file:///storage/emulated/0/Download/appN ...

  7. android.os.FileUriExposedException 自动安装APK报错 5分钟搞定Android 7.0+ FileProvider

    android.os.FileUriExposedException 自动安装APK报错  5分钟搞定Android 7.0+ FileProvider 适配步骤: 1. 创建file_paths.x ...

  8. 氢os android 7.0,率先用上Android7.0,全新氢OS成国内最受好评系统

    原标题:率先用上Android7.0,全新氢OS成国内最受好评系统 近日,OnePlus 在官网发布了基于 Android 7.0 版本的氢OS.一经发布就获得了用户的一致好评.不少用户表示,能在第一 ...

  9. android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData()在应用程序之外公开

    本文翻译自:android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app thr ...

最新文章

  1. 分布式锁原理及实现方式
  2. 浅谈数据结构-平衡二叉树
  3. lfw2019_来自 LFW SS20 你应该知道的5个时尚趋势
  4. .NET中国峰会 参与意愿调查
  5. overleaf表格_latex 表格制作
  6. python 局域网主机扫描_python扫描局域网主机名
  7. tomcat——轻量级中间件学习
  8. 关于线段树套伸展树被卡常
  9. paip.提升用户体验----记住用户名与自动登录
  10. oracle左裁剪原理,ORACLE 各种PARTITION 的分析(原)
  11. java打印菱形图案_如何使用java打印出菱形图案
  12. 设置电脑分屏显示的4种情况
  13. 小程序-实现 tab-及多个列表选项切换
  14. linux百度资源网盘,百度网盘 linux版
  15. c++ vector容器emplace_back
  16. windows下C盘文件夹管理员权限设置
  17. RT-Thread学习笔记——信号量
  18. html使背景图片毛玻璃效果,vue实现毛玻璃背景图片效果
  19. 如何使用 mocha 和 sinon 集成单元测试--单元测试示例及分析(上)
  20. 寻路 pathfinder 狂乱画

热门文章

  1. 你知道海底捞在全国有多少家店吗?
  2. 清华竟然开设:《摸鱼学导论》,这门课火了!
  3. 数据挖掘学习笔记 5 线性回归知识及预测糖尿病实例
  4. java socket 抓包_linux下用socket的抓包程序
  5. python进入内置函数文件_python基础知识-set、函数、内置函数、文件操作
  6. python内存注入代码_Python模板注入
  7. springboot 整合redis_springboot自动装配原理详解
  8. c++全局变量怎么定义_C errno全局变量是否是线程安全的
  9. 从各位前辈手中搜集的经验
  10. 谷歌Pixel 6系列手机发布会官宣定档 10月19日发布