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

问题出现

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

相关代码

报错区域的文件路径相关的代码

主要是在 File imageDir = new File(getExternalCacheDir(), "Gallery");过程中,getExternalCacheDir()报了此异常。

java 复制代码
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为文件名

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

file_paths.xml内容如下:

其中每个子标签中的 name 指的子文件夹名字,path 指路径

xml 复制代码
<?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不用进行重新指定其他路径。

xml 复制代码
<external-cache-path name="Gallery" path="." />

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

相关推荐
应用市场5 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭111995 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
geats人山人海6 小时前
java 7异常
android·java·开发语言
2601_962071007 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
2501_915918417 小时前
在 Xcode 中运行和调试单元测试的完整指南
ide·vscode·macos·ios·单元测试·个人开发·xcode
右手吉他8 小时前
高通平台IA APN问题分析之二
android·物联网
夜雪一千9 小时前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
不浪费一个字节9 小时前
一个纯 Python 实现的 APK 解析与设备操控工具箱
android
itmigrate9 小时前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
hai_android9 小时前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack