在我的 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()
)。
您的选择是:
-
坚持仅对内部存储文件使用
FileProvider
,并对外部存储上的文件使用file://
Uri
值
根据 应用程序 ID 计算出要添加到提供程序元数据的
<external-path>
值,该值指向外部存储的特定部分使用我的
StreamProvider
,它将<external-files-path>
添加为选项滚动自己的
ContentProvider
来处理这个问题,而不是使用FileProvider
或StreamProvider