【解决】 Android Studio Failed to find configured root that contains

问题出现

尝试将拍摄的图像存储至手机自定义的存储空间,不料却一直报错,主要问题是在使用 FileProvider 从文件路径中获取 Uri 时出现异常。

相关代码

报错区域的文件路径相关的代码
主要是在 File imageDir = new File(getExternalCacheDir(), “Gallery”);过程中,getExternalCacheDir()报了此异常。

File imageDir = new File(getExternalCacheDir(), "Gallery");if (!imageDir.exists()) {imageDir.mkdir();}mPhotoFile = new File(imageDir,"output_image.jpg");if(mPhotoFile.exists()){mPhotoFile.delete();}try {mPhotoFile.createNewFile();} catch (IOException e) {e.printStackTrace();}if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {mImageUri = FileProvider.getUriForFile(CameraActivity.this, getPackageName() + ".fileprovider", mPhotoFile);} else {mImageUri = Uri.fromFile(mPhotoFile);}

在AndroidManifest.xml配置FileProvider
其中 ${applicationId} 为 项目的包名,com.example.app , 具体值可以在项目模块文件夹中的 build.gradle 中找到
@xml/file_paths:为项目路径下 res/xml/file_paths.xml,file_paths为文件名

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

file_paths.xml内容如下:
其中每个子标签中的 name 指的子文件夹名字,path 指路径

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="external" path="path" />
<!--代表app外部缓存区域的根目录,与Context.getExternalCacheDir()获取的路径对应。--><external-cache-path name="Gallery" path="Android/data/com.example.app/files" />
</paths>

问题原因分析

结合上述java代码中FileProvider.getUriForFile的具体实现,发现其对应的文件夹路径为:getExternalCacheDir()/path/name,所以下面情况会形成:getExternalCacheDir()/Android/data/com.example.app/files/Gallery 这个路径,明显与File imageDir = new File(getExternalCacheDir(), “Gallery”); 不符合,所以会报异常

问题解决

其实最本质的出错是在 file_paths.xml 的配置上,把其中的 external-cache-path 改为下面的情况,问题即解决。即path = ‘.’ 表示当前路径(该路径即为Context.getExternalCacheDir()获取的路径)下,建立BEGallery子文件夹,path不用进行重新指定其他路径。

<external-cache-path name="Gallery" path="." />

如果您就想在 path中指定路径,则需要更改代码中的 imageDir.mkdir(); ,将这个创建单个文件夹,改为 imageDir.mkdirs(); 即创建多层文件夹,也可以解决此问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Nginx08】Nginx学习:HTTP核心模块(五)长连接与连接处理

Nginx学习&#xff1a;HTTP核心模块&#xff08;五&#xff09;长连接与连接处理 HTTP 基础知识大家掌握的怎么样呀&#xff1f;对于长连接这一块的内容应该也不是什么新鲜东西了吧。毕竟 HTTP1.1 都已经发布这么久了。今天主要来看的就是长连接相关的配置&#xff0c;另外还会…

ylb-接口4投资排行榜

总览&#xff1a; 1、使用Redis存储投资信息 2、Redis常量类 在common模块constants包&#xff0c;创建一个Redis常量类&#xff08;RedisKey&#xff09;&#xff1a; package com.bjpowernode.common.constants;public class RedisKey {/*投资排行榜*/public static fin…

Qt5.15.2安装

解释一下 Qt 的版本号 比如 5.15.2 是完整的 Qt 版本号&#xff0c;第一个数字 5 是大版本号&#xff08;major&#xff09;&#xff0c;第二个数字 15 是小版本号&#xff08;minor&#xff09;&#xff0c;第三个数字 2 是补丁号&#xff08;patch&#xff09;。 只要前面两个…

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的&#xff0c;USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器&#xff0c;GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps&#xff08;HBR3&#xff0c;4通道&#xf…

go map[string]any 转map[string]string

目录 一 、map[string]any参数转为map[string]string 二 、go 请求参数绑定 gin框架示例 三、 go 中实现接口 四 、go中设计模式策略模式实现 一 、map[string]any参数转为map[string]string 场景&#xff1a;在go中有将map[string]any参数转为map[string]string 其中…

uniapp和uview组件实现下拉触底刷新列表

下面是一个在UniApp中使用uView组件实现下拉触底刷新列表的示例&#xff0c;并使用Axios来请求分页数据列表&#xff1a; 首先&#xff0c;确保你已经在UniApp项目中添加了uView组件库。你可以在项目根目录执行以下命令安装它们&#xff1a; npm install uview-ui或者使用 Hb…

曲师大2023大一新生排位赛-D.Factor题解

D.Factor 题目描述 你有一个集合 &#xff0c;和具有 个正整数的数组 . 最初&#xff0c;集合 为空&#xff08;不包含任一元素&#xff09;。你将按照以下方式填充集合 : 以此枚举数组 a 中的每个元素。对于数组中的第 i 个元素 &#xff0c;生成 ​ 的因子集合 ​。如果…

使用对象解构赋值,将对象的某些属性赋值给另一个对象

在处理接口返回的数据时&#xff0c;我需要将接口返回的数据&#xff08;对象&#xff09;的某些属性用另一个对象进行接收&#xff0c;学习对象解构赋值之前&#xff0c;我一直使用的都是最笨的方法&#xff1a; this.formData.projectId res.data.projectId this.formData.…

idea中常用的快捷键

快捷键: 1.快速生成main方法 main/psvm public static void main(String[] args) {} 2.快速复制当前行的代码: ctrld 3.快速捕获异常: altctrlt 4.快速打印结果: sout/soutv System.out.println(s); System.out.println("s " s); 5.自动生成对象的返回值…

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

GitHub上整理的一些实用的工具

1. Visual Studio Code 简称VScode&#xff0c;是一个轻量且强大的跨平台开源代码编辑器&#xff08;IDE&#xff09;&#xff0c;支持Windows&#xff0c;OS X和Linux。内置JavaScript、TypeScript和Node.js支持&#xff0c;而且拥有丰富的插件生态系统&#xff0c;可通过安装…

关于GDP调试

说出一些常见的指令 break&#xff08;或缩写为b&#xff09;&#xff1a;设置断点&#xff0c;例如 b main 在 main 函数处设置断点run&#xff08;或缩写为r&#xff09;&#xff1a;运行程序。step&#xff08;或缩写为s&#xff09;&#xff1a;单步执行程序&#xff0c;进…

SylixOS下SSH和SFTP连接

简要 基于网络的连接&#xff08;telnet&#xff0c;ftp&#xff09;方便高效&#xff0c;但其是基于明文的通信&#xff0c;容易被窃取、篡改和攻击&#xff0c;存在网络安全问题&#xff0c;尤其在进行远程访问时&#xff0c;穿过复杂未知的公网环境非常危险&#xff0c;为此…

快速替换chatgpt-web项目的access token的脚本

问题背景&#xff0c;由于GPT access token 会定期失效&#xff0c;更换服务器的项目的access token较为繁琐&#xff0c;特写一脚本协助完成更换access token。 使用方法&#xff1a; # token从https://chat.openai.com/api/auth/session获取 ./replace_token.sh token脚本内…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch&#xff08;01、02、03相同&#xff09; 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试&#xff08;10.0.0.21:5601&#xff09; 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群&#xff08;投票选举机制&#xf…

代码随想录一刷day49

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣121. 买卖股票的最佳时机二、力扣122.买卖股票的最佳时机II 前言 一、力扣121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] pr…

64.合理使用预训练网络-3

64.1 目标检测中如何从零开始训练(train from scratch) 目标检测和其他任务从零训练模型一样,只要拥有足够的数据以及充分而有效的训练,同样能训练出不亚于利用预训练模型的检测器。 1、数据集不大时,同样需要进行数据集增强。2、预训练模型拥有更好的初始化,train from sc…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…

自动驾驶多任务框架 MultiTask V3、HybridNets和YOLOP比较

目标检测和分割是自动驾驶汽车感知系统的两个核心模块。它们应该具有高效率和低延迟,同时降低计算复杂性。目前,最常用的算法是基于深度神经网络的,这保证了高效率,但需要高性能的计算平台。 在自动驾驶汽车的场景下,大多使用的都是计算能力有限的嵌入式平台,这使得难以满…