在某些设备上,无法在external-files-path中获取文件的内容URI

时间:2017-03-15 20:40:05

标签: java android android-fileprovider android-storage

我的应用程序使用FileProvider获取在外部存储上的子目录中创建的文件的内容URI,并向所选的相机应用程序授予权限,以便将照片保存到该文件。它就像每个设备和模拟器上的魅力一样,除了我不拥有的一个 - 华为Honor 7(我有一个来自该设备的崩溃日志)。我试图了解问题并找到解决问题的方法。

AndroidManifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="<package>.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths" />
</provider>

file_provider_paths.xml

<paths>
    <external-files-path name="external_storage" path="" />
</paths>

当我创建一个与摄像头应用程序共享的空文件时,我使用Context.getExternalFilesDir(null)获取基本外部目录路径。 它通常返回如下路径:/storage/emulated/0/Android/data/<package>/files

与以下内容相同:

  • Context.getExternalFilesDirs(null)[0]
  • ContextCompat.getExternalFilesDirs(context, null)[0]

我把文件放得更深一些,例如/storage/emulated/0/Android/data/<package>/files/247/images/ad4b7cd7-8917-43d5-8f6c-69555d76c0e0

然后我致电FileProvider.getUriForFile(context, "<package>.fileprovider", file)

正如我所说,它适用于我拥有的所有内容,包括模拟器和设备,使用API​​ 19到25。

现在,发生了崩溃:

Caused by java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/0123-4567/Android/data/<package>/files/42/images/51e4b571-67e4-4e7d-abb0-0ae921d339f4
       at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
       at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)

我发现当前的FileProvider实现与external-files-path代码匹配此代码:

} else if (TAG_EXTERNAL_FILES.equals(tag)) {
    File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
    if (externalFilesDirs.length > 0) {
        target = externalFilesDirs[0];
    }
}

所以我的想法是,Context.getExternalFilesDir(null)可能会在ContextCompat.getExternalFilesDirs(context, null)索引处提供与0不同的存储目录。如果是这样,我会在存储上创建一个FileProvider不支持的文件。

我还向Google报告了一些关于此限制的issue

您认为这是真正的根本原因还是您有其他想法?

0 个答案:

没有答案