我有一个FileProvider工作得很好,我能够将文件共享到任何应用程序,这是我的代码:
FilePaths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- choose between cache-path (cache storage), files-path (app-private storage) and external-path (external storage) -->
<cache-path path="/" name="strips" />
</paths>
设置分享意图:
File f = new File(_fileFullName);
var contentUri = FileProvider.GetUriForFile(this,
G.FileProviderAuthorityName,
f);
intent.PutExtra(Intent.ExtraStream, contentUri);
_shareProvider.SetShareIntent(intent);
这非常有效。我忘记在这里提到我的文件通常位于app cache目录的子文件夹中,无论它们在哪里(文件夹都是动态创建的),它都能正常工作。
但是当我将xml从cache-path更改为files-path(AppPrivate存储)时,我得到IllegalArgumentException:
无法找到包含的已配置根目录 GetUriForFile调用上的/storage/emulated/0/Android/data/app.namespace/files/subfolder/data.png。
我已经尝试过FilePaths.xml中的所有变体,用Google搜索,无法找到答案。
答案 0 :(得分:2)
请忽略,发现我的问题。我使用getExternalFilesDir(null)而不是getFilesDir()来保存我的文件。
修正了通过阅读android支持库的源代码。内部getUriForFile执行此代码以决定使用哪个目录:
File target = null;
if (TAG_ROOT_PATH.equals(tag)) {
target = buildPath(DEVICE_ROOT, path);
} else if (TAG_FILES_PATH.equals(tag)) {
target = buildPath(context.getFilesDir(), path);
} else if (TAG_CACHE_PATH.equals(tag)) {
target = buildPath(context.getCacheDir(), path);
} else if (TAG_EXTERNAL.equals(tag)) {
target = buildPath(Environment.getExternalStorageDirectory(), path);
}
从XML定义中选择最接近的匹配路径,这意味着子文件夹将没有问题:
// Find the most-specific root path
Map.Entry<String, File> mostSpecific = null;
for (Map.Entry<String, File> root : mRoots.entrySet()) {
final String rootPath = root.getValue().getPath();
if (path.startsWith(rootPath) && (mostSpecific == null
|| rootPath.length() > mostSpecific.getValue().getPath().length())) {
mostSpecific = root;
}
}