如何使用FileProvider
?
FileProvider
的当前实现仅处理ContextCompat.getExternalFilesDirs
...
} else if (TAG_EXTERNAL_FILES.equals(tag)) {
File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
if (externalFilesDirs.length > 0) {
target = externalFilesDirs[0];
}
}
...
似乎没有办法为<path>
定义FileProvider
条目,该条目与辅助外部存储路径相匹配......
答案 0 :(得分:4)
答案是...... FileProvider
不支持。由于file://
Uri计划已弃用,因此在Android 7中这更是一个问题。
我发了bug report。
答案 1 :(得分:3)
要处理位于外部sdcards上的文件,我将provider_paths.xml更改为
.Elem()
答案 2 :(得分:3)
由于以下代码,FileProvider不支持二级存储:
支持代码:support-core-utils:26.1.0 FileProvider
} else if (TAG_EXTERNAL_FILES.equals(tag)) {
File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
if (externalFilesDirs.length > 0) {
target = externalFilesDirs[0];// Code here, That's why!!!
}
} else if (TAG_EXTERNAL_CACHE.equals(tag)) {
但是,FileProvider中有一个特殊的TAG: root-path ,官方参考中未提及。
if (TAG_ROOT_PATH.equals(tag)) {
target = DEVICE_ROOT;// DEVICE_ROOT = new File("/");
} else if (TAG_FILES_PATH.equals(tag)) {
因此,root-path匹配所有路径。
只需在FileProvider xml中输入此代码,然后FileProvider就可以在二级存储中处理File。
<root-path name="root" path="." />
请注意,它可能会泄露您的目录结构。
答案 3 :(得分:1)
作为解决方法,您可以使用绝对路径:
find
答案 4 :(得分:1)
所以我最终做了以下事情:
尝试通过FileProvider创建到Uri,如果由于以下原因而失败:
java.lang.IllegalArgumentException: Failed to find configured root that contains
我只是在创建一个普通的Uri。
这是我的代码:
try {
uri = FileProvider.getUriForFile(context,
MY_AUTHORITY_STRING,
imageFile);
} catch (Exception e) {
CLog.d(TAG, e);
uri = Uri.fromFile(imageFile);
}
我不知道为什么,但它正在工作,FileProvider无法访问该文件(因为它在辅助外部存储中),然后在catch子句中成功创建了uri。
奇怪的谷歌......非常奇怪。