FileProvider包含所有子文件夹

时间:2014-10-07 08:16:46

标签: android

我有一个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搜索,无法找到答案。

1 个答案:

答案 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;
                }
            }