我的应用程序使用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。
您认为这是真正的根本原因还是您有其他想法?