0

In my Android Unity plugin, I want to provide access to the screenshot that unity made, so provide access to Application.persistentDataPath, which is the files folder of the app per documentation...

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

I want also to read / write external storage. But as soon as I add...

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

...to the manifest, Unity adds the screenshots to the external storage, so FileProvider cannot provide files from there.

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

How can I still provide files from app files directory wherever it resides?

4

1 回答 1

2

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

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

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

您的选择是:

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

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

  3. 使用myStreamProvider,它<external-files-path>作为一个选项添加

  4. 自己动手ContentProvider来处理这个问题,而不是使用FileProvider或者StreamProvider

于 2016-03-08T15:42:00.923 回答