【问题标题】:FileProvider - IllegalArgumentException: Failed to find configured rootFileProvider - IllegalArgumentException:找不到配置的根
【发布时间】:2017-02-28 18:24:35
【问题描述】:

我正在尝试用相机拍照,但出现以下错误:

FATAL EXCEPTION: main
Process: com.example.marek.myapplication, PID: 6747
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.marek.myapplication/files/Pictures/JPEG_20170228_175633_470124220.jpg
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
    at com.example.marek.myapplication.MainActivity.dispatchTakePictureIntent(MainActivity.java:56)
    at com.example.marek.myapplication.MainActivity.access$100(MainActivity.java:22)
    at com.example.marek.myapplication.MainActivity$1.onClick(MainActivity.java:35)

AndroidManifest.xml:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.marek.myapplication.fileprovider"
        android:enabled="true"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

Java:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Toast.makeText(getApplicationContext(), "Error while saving picture.", Toast.LENGTH_LONG).show();
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.marek.myapplication.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="images/"/>
</paths>

我整天都在搜索这个错误并试图理解FileProvider,但我不知道这个错误消息试图告诉我什么。如果您想了解更多信息/代码,请在评论中写给我。

【问题讨论】:

  • 能否也粘贴createImageFile方法代码?
  • 非常抱歉,但我取消了这个项目,我不再继续工作了。我会接受最喜欢的答案来“关闭”这个问题。感谢大家的参与,希望对其他人有所帮助。
  • 遇到了同样的问题。使用最小的 github 示例项目找到了这个解决方案来获得基本的 FileProvider 设置:stackoverflow.com/a/48103567/2162226。它提供了将哪些文件复制(不进行更改)到本地独立项目的步骤
  • 此问题现已在 Delphi 10.4 中修复:quality.embarcadero.com/browse/RSP-26950

标签: android android-fileprovider


【解决方案1】:

您的文件存储在getExternalFilesDir() 下。这映射到&lt;external-files-path&gt;,而不是&lt;files-path&gt;。另外,您的文件路径中不包含images/,因此您的XML 中的path 属性无效。

res/xml/file_paths.xml 替换为:

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

2020 年 3 月 13 日更新

具体路径的Provider路径如下:

  • &lt;files-path/&gt; --> Context.getFilesDir()
  • &lt;cache-path/&gt; --> Context.getCacheDir()
  • &lt;external-path/&gt; --> Environment.getExternalStorageDirectory()
  • &lt;external-files-path/&gt; --> Context.getExternalFilesDir(String)
  • &lt;external-cache-path/&gt; --> Context.getExternalCacheDir()
  • &lt;external-media-path/&gt; --> Context.getExternalMediaDirs()

参考:https://developer.android.com/reference/androidx/core/content/FileProvider

【讨论】:

  • 好的,我添加了外部文件路径,但我仍然有同样的错误:/ 可能还有更多错误。我正在使用模拟器 android 设备,我必须创建那个文件夹还是什么?
  • "'path' 属性应该被定义"我们在配置中缺少路径。
  • 我在 Android 5 上遇到了多个路径的问题。只留下了一个路径,而不是 2 个。
  • 我收到了一份与此相同的崩溃报告(我认为是 50-100 台设备)。 &lt;paths xmlns:android="http://schemas.android.com/apk/res/android"&gt; &lt;external-files-path name="extfiles" path="."/&gt; &lt;/paths&gt;path="." 是我在自己的研究中发现的,以保持顶级水平。如果您更仔细地查看 FileProvider,您会看到从 XML 读取的路径被规范化了。我最好的猜测是ContextCompat#getExternalFilesDirs 返回了 null @line 616 (v26.0.1),所以没有注册 PathStrategy。这发生在华为设备上。
  • 我没有使用
【解决方案2】:

这可能会解决每个人的问题: 添加了所有标签,因此您无需担心文件夹路径。 将 res/xml/file_paths.xml 替换为:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path
    name="external"
    path="." />
  <external-files-path
    name="external_files"
    path="." />
  <cache-path
    name="cache"
    path="." />
  <external-cache-path
    name="external_cache"
    path="." />
<files-path
    name="files"
    path="." />
</paths>

编辑:2021 年 6 月 1 日

我们应该只使用我们需要的特定路径。 自行尝试替代路径并使用您需要的路径。

有关更多信息,请参阅已接受的答案https://stackoverflow.com/a/42516202/4498813

【讨论】:

  • 最佳解决方案。谢谢。
  • 使用了这个解决方案,代码开始工作了。通过测试其中哪一个正在工作来删除不必要的代码
  • 兄弟,你拯救了我的一天。非常感谢:-)
  • 为此我爱你
  • 太棒了。解决了我的问题
【解决方案3】:

我确信我迟到了,但下面对我有用。

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

【讨论】:

  • 这是让我的代码也能正常工作的最后一步!谢谢。
  • 太棒了!我试图访问 no_backup 文件夹,但我找不到在 FileProvider XML 文件中公开它的方法。谢谢!这样做解决了我的问题!
  • 这是我需要的,允许 FileProvider 访问no_backup 文件夹。
  • 非常感谢!!!!在没有其他任何事情之后,它就像一个魅力!
  • 这并没有导致崩溃。但我的图片没有附上。
【解决方案4】:

请注意,external-path 并未指向您的辅助存储,即“可移动存储”(尽管名称为“外部”)。如果您收到“无法找到配置的根目录”,您可以将此行添加到您的 XML 文件中。

<root-path name="root" path="." />

在此处查看更多详细信息FileProvider and secondary external storage

【讨论】:

    【解决方案5】:

    我会迟到,但我找到了解决方案。对我来说工作正常,我只是将路径 XML 文件更改为:

     <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <root-path name="root" path="." />
    </paths>
    

    【讨论】:

    • 对我来说,provider_paths.xml 中的这个给出了检查警告“此处不允许元素根路径”。
    • 这会发出警告..立即检查并发布正确答案。
    【解决方案6】:

    如果您使用的是内部缓存,请使用。

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <cache-path name="cache" path="/" />
    </paths>
    

    【讨论】:

    • 谢谢,我的情况:我想安装一个保存在 /data/data/pkg_name/files 中的应用程序,所以我的正确配置如下:
    【解决方案7】:

    花了 2 周的时间试图找到一些解决方案...如果您在尝试上述所有方法后到达这里:

    1 - 验证您的标签提供者是否在标签应用程序中

    <application>
    
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.Pocidadao.fileprovider" android:exported="false" android:grantUriPermissions="true">
          <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
        </provider>
    
    </application>
    

    2 - 如果你尝试了很多路径都没有成功,那么用这个来测试:

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
      <cache-path name="cache" path="." />
      <external-path name="external" path="." />
    
      <root-path name="root" path="." />
      <files-path name="my_images" path="/" />
      <files-path name="my_images" path="myfile/"/>
      <files-path name="files" path="." />
    
      <external-path name="external_files" path="." />
      <external-path name="images" path="Pictures" />
      <external-path name="my_images" path="." />
      <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures" />
      <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures/" />
    
      <external-files-path name="images" path="Pictures"/>
      <external-files-path name="camera_image" path="Pictures/"/>
      <external-files-path name="external_files" path="." />
      <external-files-path name="my_images" path="my_images" />
    
      <external-cache-path name="external_cache" path="." />
    
    </paths>
    

    测试一下,如果摄像头可以工作,那么开始消除一些线条并继续测试......

    3 - 不要忘记验证您的模拟器中是否激活了相机。

    【讨论】:

    • 谢谢,这对我有用。是否需要移除其他路径?
    【解决方案8】:

    启用风味(开发,阶段)后遇到类似问题。

    在风味之前,我的路径资源如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
        name="my_images"
        path="Android/data/pl.myapp/files/Pictures" />
    </paths>
    

    添加后 android:authorities="${applicationId}.fileprovider" 在 Manifest appId 中是 pl.myapp.dev 或 pl.myapp.stage 取决于风味和应用程序开始崩溃。 我删除了完整路径并用点替换它,一切都开始工作了。

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

    【讨论】:

    • 为我工作。谢谢!你是怎么想出“。”的。符号?
    • @antygravity 你能提供这个解决方案的参考/文档吗?
    • 这个解决方案有什么负面影响吗?
    • 为我工作,非常感谢。
    • 这应该是公认的答案!唯一有效的解决方案
    【解决方案9】:

    @CommonsWare 的回答很棒。

    但就我而言,我必须添加多个路径。

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path name="external_files" path="." />
        <files-path name="external_files" path="." />
    </paths>
    

    【讨论】:

      【解决方案10】:

      这取决于你想要做什么样的存储,内部或外部

      用于外部存储

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

      但是对于内部存储,请注意路径,因为它使用 getFilesDir() 方法 这意味着您的文件将位于应用程序的根目录中(“/”)

        File storeDir = getFilesDir(); // path "/"
      

      所以你的提供者文件必须是这样的:

      <paths>
          <files-path name="my_images" path="/" />
      </paths>
      

      【讨论】:

      • 所有示例都假定用户正在使用外部存储。我需要内部存储方面的帮助,我花了几个小时才找到这个答案。谢谢。
      【解决方案11】:

      这也让我有点困惑。

      问题出在您的 xml 文件中的“路径”属性上。

      来自此文档FileProvider 'path' 是一个子目录, 但在另一个文件(相机/照片基础)中显示 'path' 是完整路径。

      <?xml version="1.0" encoding="utf-8"?>
      <paths xmlns:android="http://schemas.android.com/apk/res/android">
          <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
      </paths>
      

      我只是将这个“路径”更改为完整路径,它就可以工作了。

      【讨论】:

        【解决方案12】:

        我为此花了 5 个小时..

        我已经尝试了上述所有方法,但这取决于您的应用当前使用的存储空间。

        https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

        在尝试代码之前检查文档。

        就我而言 因为files-path 子目录将是Context.getFilesDir()。 有趣的是它Context.getFilesDir() 注意到另一个子目录。

        我要找的是

        data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png

        Context.getFilesDir()
        

        返回 /data/user/0/com.psh.mTest/files

        所以标签应该是

        ....files-path name="app_imageDir" path="../app_imageDir/" ......

        然后就可以了!!

        【讨论】:

        • 感谢您参考文档。它使我得到了正确的答案。在我的情况下,我的文件是用 getExternalStorageDirectory() 保存的,我应该提供带有 &lt;external-path&gt; 标签而不是 &lt;files-path&gt; 的路径
        • 感谢您对文件路径的具体回答。它有很大帮助。 :)
        • 是的,它有效!关键是在路径的开头指定“..”,比如这个路径="../myDirectory/"
        • 非常感谢,效果很好!官方文档在任何时候都没有说您需要为以“/app_myfolder/”开头的文件夹添加“..”
        【解决方案13】:

        我遇到了同样的问题,我尝试了下面的代码。

        1.创建 Xmlfile : provider_paths

        <?xml version="1.0" encoding="utf-8"?>
        <paths>
            <files-path name="my_images" path="myfile/"/>
        </paths>
        

        2。 Mainfest 文件

         <provider
                    android:name="android.support.v4.content.FileProvider"
                    android:authorities="com.ril.learnet.provider"
                    android:exported="false"
                    android:grantUriPermissions="true">
                    <meta-data
                        android:name="android.support.FILE_PROVIDER_PATHS"
                        android:resource="@xml/provider_paths"/>
         </provider>
        

        3.在您的 Java 文件中。

              File file =  new File(getActivity().getFilesDir(), "myfile");
                if (!file.exists()) {
                    file.mkdirs();
                }
                String  destPath = file.getPath() + File.separator + attachmentsListBean.getFileName();
        
                       file mfile = new File(destPath);
                        Uri path;
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                        {
                            path = FileProvider.getUriForFile(AppController.getInstance().getApplicationContext(), AppController.getInstance().getApplicationContext().getPackageName() + ".provider", mfile );
                            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        } else {
                            path = Uri.fromFile(mfile);
                        }
           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            intent.setDataAndType(path, "image/*");
                            getActivity().startActivity(intent);
        

        【讨论】:

          【解决方案14】:

          我的问题是我在不同类型的文件路径中有重叠的名称,如下所示:

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

          在我将名称(“cached_files”)更改为唯一之后,我摆脱了错误。我的猜测是这些路径存储在一些 HashMap 或不允许重复的东西中。

          【讨论】:

            【解决方案15】:

            问题可能不仅仅是路径 xml。

            以下是我的解决方法:

            查看android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()中的根课程:

                public File getFileForUri(Uri uri) {
                    String path = uri.getEncodedPath();
            
                    final int splitIndex = path.indexOf('/', 1);
                    final String tag = Uri.decode(path.substring(1, splitIndex));
                    path = Uri.decode(path.substring(splitIndex + 1));
            
                    final File root = mRoots.get(tag); // mRoots is parsed from path xml
                    if (root == null) {
                        throw new IllegalArgumentException("Unable to find configured root for " + uri);
                    }
            
                    // ...
                }
            

            这意味着mRoots 应该包含请求的uri 的标签。 所以我写了一些代码打印mRoots和uri的标签,然后很容易发现标签不匹配

            事实证明,将提供者权限设置为${applicationID}.provider 是一个愚蠢的想法!这个权限太常见了,可能会被其他提供者使用,这会弄乱路径配置!

            【讨论】:

              【解决方案16】:

              试试这个

              <?xml version="1.0" encoding="utf-8"?>
              <paths xmlns:android="http://schemas.android.com/apk/res/android">
                  <external-path
                      name="my_images"
                      path="" />
              </paths>
              

              【讨论】:

              • 欢迎来到 StackOverflow!您可以通过添加解释来提高答案的质量(“试试这个代码,因为...”)。这将帮助其他人了解为什么他们应该使用您的代码。
              • 路径不能为空
              • 我认为我们不应该对他投反对票,他是新来的!所有这些反对票都阻止他使用 SO!我们可以评论他,让他知道如何提供帮助!至少他试图帮助某人,他没有写所有的信息,因为他在平台上太新了!
              【解决方案17】:

              如果没有任何帮助并且您遇到了错误

              failed to find configured root that contains /data/data/...
              

              然后尝试更改一些行,例如:

              File directory = thisActivity.getDir("images", Context.MODE_PRIVATE);
              

              到:

              File directory = new File(thisActivity.getFilesDir(), "images");
              

              在xml文件中:

              <files-path name="files" path="." />
              

              这很奇怪,因为我访问的文件夹是/images

              【讨论】:

              • 从 .getDir 切换到 .getFilesDir 帮助了我。谢谢!
              【解决方案18】:

              您需要确保您的 file_paths.xml 文件的内容包含此字符串 => "/Android/data/com.example.marek.myapplication/files/Pictures/"

              从错误消息中可以看出,这是存储图片的路径。查看预期样本

              files_path.xml 如下:

              <external-path name="qit_images" path="Android/data/com.example.marek.myapplication/files/Pictures/" />
              

              【讨论】:

                【解决方案19】:

                这也对我有用。我没有给出完整路径,而是给出了 path="Pictures" 并且效果很好。

                <?xml version="1.0" encoding="utf-8"?>
                 <paths>
                  <external-files-path
                    name="images"
                    path="Pictures">
                  </external-files-path>
                 </paths>
                

                【讨论】:

                  【解决方案20】:

                  这些都不适合我。唯一可行的方法是不在 xml 中声明显式路径。所以这样做并快乐:

                  <?xml version="1.0" encoding="utf-8"?>
                  <paths xmlns:android="http://schemas.android.com/apk/res/android">
                      <external-path name="my_images" path="." />
                  </paths>
                  

                  这里也有一个关于这个问题的优秀教程: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s

                  【讨论】:

                    【解决方案21】:

                    如果您的文件路径类似于 /storage/emulated/0/"yourfile"

                    你只需要修改你的 FileProvider xml

                    <paths>
                        <external-path name="external" path="." />
                    </paths>
                    

                    然后当你需要共享文件时调用这个函数

                    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                                        Uri fileUri = FileProvider.getUriForFile(getContext(),
                                                "com.example.myapp.fileprovider",
                                                file);
                                        sharingIntent.setType("*/*"); // any flie type
                                        sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
                                        startActivity(Intent.createChooser(sharingIntent, "Share file"));
                    

                    它适用于 android M ~ Pie

                    【讨论】:

                    • 成功了!但是你能解释一下为什么我们使用 path="."而不是 path="DCIM", "图片"...?
                    • @Hoang Lam 区别在于是否需要指定目录,在我的例子中可以全部访问
                    【解决方案22】:

                    我做了什么来解决这个问题 -

                    AndroidManifest.xml

                    <provider
                                android:name="android.support.v4.content.FileProvider"
                                android:authorities="com.mydomain.fileprovider"
                                android:exported="false"
                                android:grantUriPermissions="true">
                                <meta-data
                                    android:name="android.support.FILE_PROVIDER_PATHS"
                                    android:resource="@xml/filepaths"/>
                            </provider>
                    

                    filepaths.xml(允许 FileProvider 共享应用程序外部文件目录中的所有文件)

                    <?xml version="1.0" encoding="utf-8"?>
                    <paths xmlns:android="http://schemas.android.com/apk/res/android">
                        <external-files-path name="files"
                            path="/" />
                    </paths>
                    

                    在java类中-

                    Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);
                    

                    【讨论】:

                      【解决方案23】:

                      我的问题是文件名错误: 我在 res/xml 下创建 file_paths.xml 而资源在 Manifest 中设置为 provider_paths.xml

                      <provider
                              android:authorities="ir.aghigh.radio.fileprovider"
                              android:name="android.support.v4.content.FileProvider"
                              android:exported="false"
                              android:grantUriPermissions="true">
                              <meta-data
                                  android:name="android.support.FILE_PROVIDER_PATHS"
                                  android:resource="@xml/provider_paths"/>
                          </provider>
                      

                      我将provider_paths 更改为file_paths 并解决了问题。

                      【讨论】:

                        【解决方案24】:

                        检查您的设备提供了多少存储空间 - 不支持从辅助存储空间共享文件。查看FileProvider.java 来源(来自support-core-utils 25.3.1):

                                    } else if (TAG_EXTERNAL_FILES.equals(tag)) {
                                        File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
                                        if (externalFilesDirs.length > 0) {
                                            target = externalFilesDirs[0];
                                        }
                                    } else if (TAG_EXTERNAL_CACHE.equals(tag)) {
                                        File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
                                        if (externalCacheDirs.length > 0) {
                                            target = externalCacheDirs[0];
                                        }
                                    }
                        

                        所以,它们只占用第一个存储空间。

                        另外,您可以看到getExternalCacheDirs() 用于通过ContextCompat 接口获取存储列表。请参阅documentation 了解其限制(例如,它被告知无法识别 USB 闪存)。最好是自己从这个 API 中生成一些存储列表的调试输出,以便您可以检查存储路径是否与传递给 getUriForFile() 的路径匹配。

                        Google 的问题跟踪器中已经有一个ticket assigned(如 06-2017),要求支持多个存储。最后,我也找到了SO question on this

                        【讨论】:

                        • 这个深入的答案应该会得到更多的支持。感谢您搜索 FileProvider 实际识别的外部存储。
                        【解决方案25】:

                        我收到此错误Failed to find configured root that contains...

                        以下解决方法解决了我的问题

                        res/xml/file_paths.xml

                        <paths xmlns:android="http://schemas.android.com/apk/res/android">
                                <external-path name="media" path="." />
                        </paths>
                        

                        AndroidManifest.xml

                        <provider
                              android:name="android.support.v4.content.FileProvider"
                              android:authorities="[PACKAGE_NAME]"
                              android:exported="false"
                              android:grantUriPermissions="true">
                                 <meta-data
                                    android:name="android.support.FILE_PROVIDER_PATHS"
                                    android:resource="@xml/file_paths">
                                 </meta-data>
                        </provider>
                        

                        ActivityClass.java

                        void shareImage() {
                                Intent intent = new Intent(Intent.ACTION_SEND);
                                intent.setType("image/*");
                                intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,"com.slappstudio.pencilsketchphotomaker", selectedFilePath));
                                startActivity(Intent.createChooser(intent,getString(R.string.string_share_with)));
                            }
                        

                        【讨论】:

                          【解决方案26】:

                          Android官方文档说file_paths.xml应该有:

                          <?xml version="1.0" encoding="utf-8"?>
                          <paths xmlns:android="http://schemas.android.com/apk/res/android">   
                              <external-path name="my_images"    
                                  path="Android/data/com.example.package.name/files/Pictures" />
                          </paths>
                          

                          但要使其在最新的 android 中工作,路径末尾应该有一个“/”,如下所示:

                          <?xml version="1.0" encoding="utf-8"?>
                          <paths xmlns:android="http://schemas.android.com/apk/res/android">   
                              <external-path name="my_images"    
                                  path="Android/data/com.example.package.name/files/Pictures/" />
                          </paths>
                          

                          【讨论】:

                            【解决方案27】:

                            xml file_paths 文件中的以下更改对我有用。

                             <external-files-path name="my_images" path="Pictures"/>
                             <external-files-path name="my_movies" path="Movies"/>
                            

                            【讨论】:

                              【解决方案28】:

                              以上都不适合我, 经过几个小时的调试,我发现问题出在createImageFile(),特别是absolute path vs relative path

                              我假设你们正在使用官方的 Android 指南来拍照。 https://developer.android.com/training/camera/photobasics

                                  private static File createImageFile(Context context) throws IOException {
                                      // Create an image file name
                                      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                                      String imageFileName = "JPEG_" + timeStamp + "_";
                                      File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
                                      File image = File.createTempFile(
                                              imageFileName,  /* prefix */
                                              ".jpg",         /* suffix */
                                              storageDir      /* directory */
                                      );
                              
                                      // Save a file: path for use with ACTION_VIEW intents
                                      mCurrentPhotoPath = image.getAbsolutePath();
                                      return image;
                                  }
                              

                              记下storageDir,这是创建文件的位置。所以为了得到这个文件的绝对路径,我就简单的使用image.getAbsolutePath(),这个路径会在onActivityResult使用,如果你需要拍照后的Bitmap图片

                              下面是file_path.xml,只需使用.,这样就可以使用绝对路径了

                              <paths>
                                  <external-path
                                      name="my_images"
                                      path="." />
                              </paths>
                              

                              如果您在拍照后需要位图

                              protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                                      super.onActivityResult(requestCode, resultCode, data);
                                      Bitmap bmp = null;
                                      try {
                                          bmp = BitmapFactory.decodeFile(mCurrentPhotoPath);
                                      } catch (Exception e) {
                                          e.printStackTrace();
                                      }
                                  }
                              

                              【讨论】:

                                【解决方案29】:

                                您需要更改 xml 文件 file_paths.xml 来自

                                <?xml version="1.0" encoding="utf-8"?>
                                <paths>
                                    <files-path name="my_images" path="images/"/>
                                </paths>
                                

                                <?xml version="1.0" encoding="utf-8"?>
                                <paths>
                                    <exeternal-path name="my_images" path="Android/data/com.example.marek.myapplication/files/Pictures"/>
                                </paths>
                                

                                【讨论】:

                                • 虽然你已经从上面复制了你的答案,但它没有正确完成。请更正答案中的输入不匹配。
                                • @AbhinavSaxena 请添加指向包含此评论副本的评论的链接。请比较日期。我在 2019 年 3 月 6 日 14:36 没有找到任何符合我的建议的 cmets(将“路径”属性设置为正确的字符串)并添加了答案。如果答案已经被复制,我将删除评论。
                                【解决方案30】:

                                我看到至少您没有在 file_paths.xml 中提供与其他路径相同的路径。 因此,请确保您在 3 个位置提供完全相同的包名称或路径,包括:

                                • android:authorities 清单中的属性
                                • pathfile_paths.xml 中的属性
                                • authority 调用 FileProvider.getUriForFile() 时的参数。

                                【讨论】:

                                  猜你喜欢
                                  • 2013-12-14
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2017-07-14
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多