【问题标题】:IllegalArgumentException: Failed to find configuration root that contains xxx on FileProvider.getUriForFileIllegalArgumentException:无法在 FileProvider.getUriForFile 上找到包含 xxx 的配置根目录
【发布时间】:2013-12-25 15:24:46
【问题描述】:

我一直在尝试关注Android tutorial 分享文件。 我这样设置FileProvider

在主清单 xml 上:

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

res/xml/filpaths.xml 文件:

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

在我的代码中,我正在尝试以下操作:

File requestFile = new File(mImageFilenames[position]);
                try {
                    fileUri = FileProvider.getUriForFile(
                            SeventhActivity.this,
                            "com.example.mysecondapp.fileprovider",
                            requestFile);
                } catch (IllegalArgumentException e) {
                    Log.e("File Selector",
                            "The selected file can't be shared: " +
                                    mImageFilenames[position]);
                }

requestFile 使用文件的正确工作路径进行实例化。 该文件的路径完全以getExternalFilesDir(Environment.DIRECTORY_PICTURES) 返回的内容开头。 我只是无法理解是什么引发了错误,因为一切似乎都合适。 提前致谢。

【问题讨论】:

标签: android filepath illegalargumentexception android-fileprovider


【解决方案1】:

在我的情况下,将 implementation 'com.android.support:support-v4:28.0.0' 添加到应用程序 gradlle 依赖项中有效。 请相应地更改 SDK 平台版本(在我的情况下为 28.0.0)。

【讨论】:

    【解决方案2】:

    如果你不尝试将异常捕获为 FileProvider.getUriFoFile() 的 IllegalArgumentException,当你运行你的代码时,你也会有这个异常。

    try {
         Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f);
    } catch (IllegalArgumentException e) {
         e.printStackTrace();
    }
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我刚刚遇到了类似的问题。

      我发现的一个懒惰的解决方案是使用:

      <external-path name="myexternalimages" path="Android/" />
      

      因为 getExternalStorageDirectory 返回“/storage/emulated/0/”,共享 /Android(下一级)将允许访问您应用中的任何文件。

      或者,如果你想更精确,你可以这样做:

      <external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />
      

      这感觉不太对劲,但似乎确实有效!

      【讨论】:

      • @eAj:工作就像一个魅力 - 借条啤酒
      • 等一下,用户显然想使用 getExternalFilesDirs,而不是 getExternalStorageDirectory。那么我们为什么要指定&lt;external-path&gt; 而不是&lt;files-path&gt;
      • @IgorGanapolsky 因为&lt;files-path&gt; 服务于内部内存files 目录/data/data/BUNDLE/files 不是外部存储
      【解决方案4】:

      该文件的路径完全以 getExternalFilesDir(Environment.DIRECTORY_PICTURES) 返回的内容开头。

      AFAIK,这不会给你一个名为 SpCars_album/ 的目录。

      我只是不明白是什么引发了错误,因为一切似乎都合适。

      您提供的文件不是您定义的根中的FileProvider 可以提供的文件。


      更新

      我忘了这与a documentation bug on FileProvider 相关联。 FileProvider&lt;external-path&gt; 确实getExternalFilesDir() 提供文件,而是从 Environment.getExternalStorageDirectory() 提供文件。我创建了a StreamProvider subclass that offers support for getExternalFilesDir()

      如果您使用我的StreamProvider,将您的&lt;external-path&gt; 替换为&lt;external-files-path name="myexternalimages" path="Pictures/SpCars_album/" /&gt;,您应该会有更好的运气。

      【讨论】:

      • 然后假设我要服务的文件在以下路径中:'/storage/emulated/0/Android/data/com.example.mysecondapp/files/Pictures/SpCars_Album/' 什么我应该在我的文件路径 xml 文件中指定吗?
      猜你喜欢
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多