解决 Android N 上报错:android.os.FileUriExposedException: file:///storage/emulated/0/
解决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/相关推荐
- Android7.0解决 android.os.FileUriExposedException: file:///storage/emulated/0/
解决Android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx 原因: Android N ...
- Android打开相机,报出 android.os.FileUriExposedException: file:///storage/emulated/0/test/img.jpg exposed
执行以下代码后,打开相机 //调用相机自带的照相功能 指定图片目录 if (Environment.getExternalStorageState().endsWith(Environment.MED ...
- android os FileUriExposedException file storage emulated 0 test tx
错误出现原因: 在Android版本7.0以上,应用之间文件访问权限修改. 解决办法: 我们需要使用FileProvider允许其他应用访问本应用创建的文件或文件夹,首先需要创建继承android.s ...
- android.os.FileUriExposedException: file:///storage/emulated/0/pictures/1564739776566.jpg exposed be
问题: 原因:Android N(对应sdk24)(版本7.0)及以上对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI ...
- android.os.FileUriExposedException: file:///storage/emulated/0/myxmpp/154094
在项目的MainActivity的开始添加下面这段代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {StrictMode.VmPol ...
- android.os.FileUriExposedException: file:///storage/emulated/0/myimage/15115
复制的https://blog.csdn.net/qq_33210042/article/details/78626701 管用!已收藏 //取消严格模式 FileProvider if (Build ...
- FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk
安卓在app更新的时候file parseuri 报错FileuriExposedException:.................exposed beyond app through Inten ...
- FileUriExposedException: file:///storage/emulated/0/001/1612321465868.mp4 exposed beyond app through
我在调用系统相机的时候报错 private void openCamera() {Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE) ...
- 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 ...
最新文章
- hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数
- lua学习笔记-HelloWorld
- python numpy库等差不均分_numpy.linspace 生成等差数组的方法
- linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...
- Java 中 this 和 super 的用法总结
- 【操作系统】Mac环境配置
- POJ - 2236 Wireless Network
- C语言 简单选择排序算法
- python之函数习题
- CyberDuck是一个很棒的 FTP SFTP图形化工具
- acm 计算几何题目集合
- JavaScript Eval Encode/Decode JavaScript Eval 在线加密/解密, 编码/解码工具
- 耳中明珠绾臂金环:古代女子私妆的故事(组图)
- 处理el获取session值:严重: Servlet.service() for servlet [LoginServlet] in context with path [/LDMS]...
- 小游戏的processing实现
- 苹果七绕过基带激活2020_【快讯:苹果135亿的基带订单,高通疑有诈直接拒绝了;网传索尼移动考虑退出东南亚手机市场;黑客成功获取iPhone XS 权限】...
- macosx10.13运行go报dyld: Symbol not found: _SecTrustEvaluateWithError错误的解决办法
- 系统安全测试要怎么做,详细来说说
- 学计算机与学英语作文,myfamily英语作文范文学习
- ant property总结
热门文章
- python语法(三)字符串
- PythonTkinter 练习16之 自编工具 扫描 WIFI
- RHEL环境搭建--Nginx|Tomcat|Java|Dubbo|RabbitMQ|Redis|Nexus|MySQL
- 第0篇 开始学习Qt 与Qt Creator
- 计算机算法的概念教案,1.1.1 算法的概念公开课教案(教学设计)
- 黑客常用端口漏洞利用
- Linux 不小心将某目录下文件全删除了,如何恢复
- 《学习如何学习》Week1 2.3-2.4 记忆介绍+学习中睡眠的重要性
- 基于微信小程序学校部门年终绩效考核自动评分系统(源码+文档+数据库+PPT)
- c# 调用oracle function,在C#中如何利用adodb调用oracle中定义的函数