android getUriForFile 失败 external_files_path

android getUriForFile fails for external_files_path

* 新信息 * 单步进入 FileProvider 代码,我看到 external-files-path 实际上并不是植根于 /storage/emulated/0/,而是植根于 /storage/emulated/0/Android/data/com.perinote.perinote/files/。所以,我问一个问题,如何共享外部存储/DCIM 中的文件?


我正在将 "external" 文件传递​​给 Intent 并收到 "IllegalArgumentException: Failed to find configured root that contains ..." 错误。

不确定缺少什么。对 "cache" 文件执行类似的操作。

这是我的清单的供应商部分:

    <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="com.perinote.image_access"
      android:grantUriPermissions="true"
      android:exported="false">
        <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/filepaths" />
    </provider>

"filepaths.xml" 文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-files-path
    path="DCIM/Perinote/" name="images" /> <!-- must be same as ImageData.getPerinoteDirectory -->
</paths>

还有代码片段,其中 "file" 是相关文件名(不带路径):

Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {address});
intent.putExtra (Intent.EXTRA_SUBJECT, subject);
intent.putExtra (Intent.EXTRA_TEXT, body);
Uri uri = FileProvider.getUriForFile (getContext (), "com.perinote.image_access", file);
intent.putExtra (Intent.EXTRA_STREAM, uri);
intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags (Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult (intent, ACTIVITY_REQUEST_SEND_EMAIL);

getUriForFile() 失败。

当我在设备上使用文件管理器应用程序时,文件肯定存在,在 DCIM/Perinote/

例如,使用调试器,文件是"IMG_20171130_204015.jpg"。 在 Windows 上打开 explorer window 显示路径

This PC\Moto G (4)\Internal shared storage\DCIM\Perinote

文件出现在下面的列表中。

您应该先将 <external-files-path 更改为 <external-path.