Intent.ACTION_OPEN_DOCUMENT 和应用私有文件

问题描述

我正在努力将我的应用程序转移到范围存储。该应用程序的一项功能是它包含存储为应用程序资产的文档模板。在运行时,它们被复制到本地存储,这里:(代码为Java)

String path = Environment.getExternalStoragePublicDirectory(
                              Environment.DIRECTORY_DOWNLOADS)
                              .getAbsolutePath() +
                              File.separator + "Templates";

由于这些文件是应用程序私有的,我很高兴将它们放入

String path = context.getFilesDir()
            .getAbsolutePath() +
             File.separator + "Templates";

但我也计划为用户浏览文件执行此操作(或类似操作):

Intent newIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
newIntent.addCategory(Intent.CATEGORY_OPENABLE);
newIntent.setType("*/*");
startActivityForResult(newIntent,0);

我的问题是,如何让 ACTION_OPEN_DOCUMENT 将我放置模板的位置包含为可浏览的位置?

解决方法

在系统文件选择器中从您的应用程序公开私人文件的唯一方法是create a custom DocumentsProvider。这会将您的应用添加为用户可以选择的文件源。

请注意,使用这种方法,根本不需要将文件复制到本地存储 - 您的 opening a document 代码可以使用 AssetManageropenFd() 方法以及 {{3 }} 直接将其传递给调用应用程序,而无需通过 File API。