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

时间:2016-03-08 15:33:48

标签: android unity3d android-external-storage android-fileprovider android-unity-plugin

在我的Android 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目录的文件?

1 个答案:

答案 0 :(得分:2)

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

在您的提供商元数据中,您只支持getFilesDir()(及其下方的位置)作为您愿意提供的地方。但是,您传递到File的{​​{1}}对象似乎是从getUriForFile()构建的,这不是一回事。

很遗憾,getExternalFilesDir()无法直接访问FileProvidergetExternalFilesDir()接近,文档声称它指向<external-path>。那是a documentation bug; getExternalFilesDir()确实指向外部存储的根(即<external-path>)。

您的选择是:

  1. 仅针对您的内部存储文件坚持Environment.getExternalStorageDirectory(),并对外部存储空间中的文件使用FileProvider file://

  2. 根据您的应用ID,计算出Uri值,以添加到指向外部存储特定部分的提供商元数据

  3. 使用my StreamProvider,添加<external-path>作为选项

  4. 推送自己的<external-files-path>来处理此问题,而不是使用ContentProviderFileProvider