为什么 FileProvider 在使用 READ_EXTERNAL_STORAGE 权限时也会失败?

Why FileProvider fails when using READ_EXTERNAL_STORAGE permission as well?

在我的 Android Unity 插件中,我想提供对 unity 制作的屏幕截图的访问权限,因此提供对 Application.persistentDataPath 的访问权限,这是每个应用程序的 files 文件夹文档...

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

我也想读/写外部存储。但是一旦我添加...

<!-- For access `DICM/Camera` -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

...对于清单,Unity 将屏幕截图添加到外部存储,因此 FileProvider 无法从那里提供文件。

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/<PACKAGE_NAME>/files/<FILE_NAME>

我如何仍然提供来自应用 files 目录 的文件?

当您传入与您的配置不匹配的 File 时,我通常会看到 from getUriForFile() 出现该消息。

在您的提供商元数据中,您仅支持 getFilesDir()(及其下方的位置)作为您愿意提供服务的位置。但是,您传递给 getUriForFile()File 对象似乎是从 getExternalFilesDir() 构建的,这不是一回事。

遗憾的是,FileProvider 不提供对 getExternalFilesDir() 的直接访问。 <external-path> 接近,文档声称它指向 getExternalFilesDir()。即a documentation bug<external-path> 真正指向外部存储的根目录(即 Environment.getExternalStorageDirectory())。

您的选择是:

  1. 仅对内部存储文件坚持 FileProvider,对外部存储文件使用 file:// Uri

  2. 根据您的应用程序 ID

  3. 计算出一个 <external-path> 值以添加到您的提供商元数据中,该值指向您的外部存储的特定部分
  4. 使用my StreamProvider,添加<external-files-path>作为选项

  5. 使用自己的 ContentProvider 来处理这个问题,而不是使用 FileProviderStreamProvider