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

原因:

Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。
而进行此授权的最简单方式是使用 FileProvider类。

解决方法:

1.在mainfest中加入FileProvider注册

<application>......<provider
         android:authorities="你的应用名.fileprovider"android:name="android.support.v4.content.FileProvider"android:grantUriPermissions="true"android:exported="false"><meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths"/></provider></application>

2.配置filepaths文件

<?xml version="1.0" encoding="utf-8"?>
<paths><external-path path="honjane/" name="files_path" />
</paths>

其中:
files-path代表的根目录: Context.getFilesDir()
external-path代表的根目录: Environment.getExternalStorageDirectory()
cache-path代表的根目录: getCacheDir()

<external-path path="honjane/" name="files_path" />

path 代表要共享的目录
name 只是一个标示,随便取吧 自己看的懂就ok

举个栗子:通过provider获取到的uri链接

content://com.honjane.providerdemo.fileprovider/files_path/files/b7d4b092822da.pdf

name对应到链接中的files_path

path对应到链接中的 files ,当然files是在honjane/目录下

3.访问文件

 /*** 打开文件* 当手机中没有一个app可以打开file时会抛ActivityNotFoundException* @param context     activity* @param file        File* @param contentType 文件类型如:文本(text/html)     */public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException {if (context == null) {return;}Intent intent = new Intent(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(getUriForFile(context, file), contentType);if (!(context instanceof Activity)) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}/*** 打开相机** @param activity    Activity* @param file        File* @param requestCode result requestCode*/public static void startActionCapture(Activity activity, File file, int requestCode) {if (activity == null) {return;}Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, getUriForFile(activity, file));activity.startActivityForResult(intent, requestCode);}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.getApplicationContext(), "你的应用名.fileprovider", file);} else {uri = Uri.fromFile(file);}return uri;}

同样访问相机相册都通过FileProvider.getUriForFile申请临时共享空间
已写成工具类上传到github,需要直接下载
使用方法简单,一行代码搞定
打开文件:

 try {FileUtils.startActionFile(this,path,mContentType);}catch (ActivityNotFoundException e){}

调用相机:

 FileUtils.startActionCapture(this, file, requestCode);

修复bug:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/xxx/xxx/file/12b31d2cab6ed.pdf

external与storage/emulated/0/对应,乍一看貌似没什么问题,path设置的是external的根路径,对应Environment.getExternalStorageDirectory(),

然而这个方法所获取的只是内置SD卡的路径,所以当选择的相册中的图片是外置SD卡的时候,就查找不到图片地址了,因此便抛出了failed to find configured root that contains的错误。

通过分析FileProvider源码发现,在xml解析到对应的标签后,会执行 buildPath() 方法来将根标签(files-path,cache-path,external-path等)对应的路径作为文件根路径,

在buildPath(),会根据一些常量判断是构建哪个目录下的path,除了上面介绍的几种path外还有个TAG_ROOT_PATH = “root-path” ,只有当不是root-path时才会去构建其他path,

官方也没介绍这个root-path,测试了一下发现对应的是DEVICE_ROOT指向的整个存储的根路径,这个bug就修复了

修改filepaths文件:

<paths><root-path name="honjane" path="" />
</paths>

代码下载:https://github.com/honjane/fileProviderDemo

解决 Android N 上报错:android.os.FileUriExposedException: file:///storage/emulated/0/相关推荐

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

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

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

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

  3. android os FileUriExposedException file storage emulated 0 test tx

    错误出现原因: 在Android版本7.0以上,应用之间文件访问权限修改. 解决办法: 我们需要使用FileProvider允许其他应用访问本应用创建的文件或文件夹,首先需要创建继承android.s ...

  4. android.os.FileUriExposedException: file:///storage/emulated/0/pictures/1564739776566.jpg exposed be

    问题: 原因:Android N(对应sdk24)(版本7.0)及以上对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI ...

  5. android.os.FileUriExposedException: file:///storage/emulated/0/myxmpp/154094

    在项目的MainActivity的开始添加下面这段代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {StrictMode.VmPol ...

  6. android.os.FileUriExposedException: file:///storage/emulated/0/myimage/15115

    复制的https://blog.csdn.net/qq_33210042/article/details/78626701 管用!已收藏 //取消严格模式 FileProvider if (Build ...

  7. FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk

    安卓在app更新的时候file parseuri 报错FileuriExposedException:.................exposed beyond app through Inten ...

  8. FileUriExposedException: file:///storage/emulated/0/001/1612321465868.mp4 exposed beyond app through

    我在调用系统相机的时候报错 private void openCamera() {Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE) ...

  9. 2022-02-25 android java file:///storage/emulated/0路径通过Uri.parse(uriString).g形式转换/storage/emulated/0

    一.有时候获取到文件的路径是这样一种形式 file:///storage/emulated/0,通过Uri.parse(uriString).getPath()可以转换成/storage/emulat ...

最新文章

  1. hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数
  2. lua学习笔记-HelloWorld
  3. python numpy库等差不均分_numpy.linspace 生成等差数组的方法
  4. linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...
  5. Java 中 this 和 super 的用法总结
  6. 【操作系统】Mac环境配置
  7. POJ - 2236 Wireless Network
  8. C语言 简单选择排序算法
  9. python之函数习题
  10. CyberDuck是一个很棒的 FTP SFTP图形化工具
  11. acm 计算几何题目集合
  12. JavaScript Eval Encode/Decode JavaScript Eval 在线加密/解密, 编码/解码工具
  13. 耳中明珠绾臂金环:古代女子私妆的故事(组图)
  14. 处理el获取session值:严重: Servlet.service() for servlet [LoginServlet] in context with path [/LDMS]...
  15. 小游戏的processing实现
  16. 苹果七绕过基带激活2020_【快讯:苹果135亿的基带订单,高通疑有诈直接拒绝了;网传索尼移动考虑退出东南亚手机市场;黑客成功获取iPhone XS 权限】...
  17. macosx10.13运行go报dyld: Symbol not found: _SecTrustEvaluateWithError错误的解决办法
  18. 系统安全测试要怎么做,详细来说说
  19. 学计算机与学英语作文,myfamily英语作文范文学习
  20. ant property总结

热门文章

  1. python语法(三)字符串
  2. PythonTkinter 练习16之 自编工具 扫描 WIFI
  3. RHEL环境搭建--Nginx|Tomcat|Java|Dubbo|RabbitMQ|Redis|Nexus|MySQL
  4. 第0篇 开始学习Qt 与Qt Creator
  5. 计算机算法的概念教案,1.1.1 算法的概念公开课教案(教学设计)
  6. 黑客常用端口漏洞利用
  7. Linux 不小心将某目录下文件全删除了,如何恢复
  8. 《学习如何学习》Week1 2.3-2.4 记忆介绍+学习中睡眠的重要性
  9. 基于微信小程序学校部门年终绩效考核自动评分系统(源码+文档+数据库+PPT)
  10. c# 调用oracle function,在C#中如何利用adodb调用oracle中定义的函数