为什么文件提供程序在使用READ_EXTERNAL_STORAGE权限时也会失败



在我的 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目录中提供文件,无论它位于何处?

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

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

不幸的是,FileProvider不提供对getExternalFilesDir()的直接访问。 <external-path>接近,文档声称它指向getExternalFilesDir()。这是一个文档错误; <external-path>实际上指向外部存储的根(即Environment.getExternalStorageDirectory())。

您的选择是:

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

  2. 根据
  3. 应用程序 ID 计算出要添加到提供程序元数据的<external-path>值,该值指向外部存储的特定部分

  4. 使用我的StreamProvider ,它将<external-files-path>添加为选项

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

相关内容

  • 没有找到相关文章

最新更新