如何更好地控制 Android SAF UI(例如 ACTION_OPEN_DOCUMENT)?

Phi*_*p G 6 android android-intent android-contentprovider storage-access-framework

我希望 SAF 在指定文档中\xe2\x80\x9claunch 导航器(如果它是文件夹\xe2\x80\x9d)(他们在文档中这么称呼它)。

\n\n

这不起作用,所以我还想知道是否可以将存储快捷方式添加到 SAF UI。请参阅此链接中的图片:https://i.stack.imgur.com/adINm.jpg

\n\n

但我认为更有可能在特定文件夹中启动 SAF UI,因此我暂时可能会采用这种方法。我已经在 - 方法中尝试过onCreate(...)

\n\n
String pathAsString = Environment.getExternalStorageDirectory() + "/myscientificapp/measurements/";\nFile pathAsFile = new File(pathAsString);\n\nif (pathAsFile.exists()) { Log.d(TAG, "pathAsFile exists!"); } //This is printed in Logcat\n\nandroid.net.Uri pathAsUri = Uri.fromFile(pathAsFile);\nIntent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);\nintent.addCategory(Intent.CATEGORY_OPENABLE);\nintent.setType("*/*");\nintent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsUri); //Does not make effect\nstartActivityForResult(intent, REQUEST_OPEN_DOCUMENT);\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是它不起作用..或者我不知道该怎么做。:/

\n\n

我读过一些关于这些地方的内容。例如在Medium.com上,一位开发人员说:

\n\n
\n

当使用 ACTION_CREATE_DOCUMENT 选择保存文件的位置或打开文档时,新的 EXTRA_INITIAL_URI 允许您使用自己的自定义起始位置覆盖默认初始位置(用户选择的最后位置)。

\n
\n\n

在 Android 文档中,我们可以阅读有关EXTRA_INITIAL_URI的信息:

\n\n
\n

调用者可以通过 DocumentsContract#EXTRA_INITIAL_URI 设置文档 URI 来指示文档导航器的初始位置。如果指定文档是文件夹,系统将尽力在指定文档中启动导航器;如果不是,则在包含指定文档的文件夹中启动导航器。

\n
\n\n

我们还可以在DocumentsContract#EXTRA_INITIAL_URI中阅读相关内容:

\n\n
\n

EXTRA_INITIAL_URI

\n ...
\n 设置显示文件选择器时用户可见的所需初始位置。
...
位置应指定文档 URI 或带有文档 ID 的树 URI。如果此 URI 标识非目录,文档导航器将尝试使用文档的父级作为初始位置。

如果缺少此额外内容或文档导航器无法找到所需的初始位置,则初始位置是系统特定的。

\n
\n\n

高度抽象语言的所有荣耀,但我想至少了解如何使用此功能的一些细节。

\n\n

但在 Stackoverflow 上,一些开发人员告诉我们,它行不通

\n\n

有些话题还没有得到真正的回答

\n\n

所以根据一些消息来源,它应该有效。

\n\n

有人知道如何在 SAF UI 中创建快捷方式(见图)吗?或者如何使 SAF \xe2\x80\x9 在指定文档中启动导航器(如果它是文件夹\xe2\x80\x9d,例如 ACTION_CREATE_DOCUMENT)?(如果我没记错的话,这些功能就存在于 Windows 95 中:> )

\n\n

编辑:\n我删除了 git 项目的一些链接,因为最终“链接腐烂”正如 @A Jar of Clay 暗示的那样。

\n\n

我也尝试将树 Uri (如 @CommonsWare 推荐)从 ACTION_OPEN_DOCUMENT_TREE 传递到方法上intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsTreeUri);。但 SAF 并没有从我作为 Uri 传递的位置开始。:(

\n

Sch*_*TGG 3

亚历克斯·贝克的这个答案对我有用,我认为它也对你有用。

DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());
Run Code Online (Sandbox Code Playgroud)

从 ACTION_OPEN_DOCUMENT_TREE 获得的 resultData.getData() 是您在 fromTreeUri() 中开始的 uri。

类似于“位置应指定文档 URI 或带有文档 ID 的树 URI”。“带有文档ID”似乎是必不可少的。我可以直接使用 ACTION_OPEN_DOCUMENT 中的 resultData.getData() 并且它有效。直接将 resultData.getData 与 ACTION_OPEN_DOCUMENT_TREE 一起使用不起作用,但在上述过程之后起作用。

不管怎样,对我有用,希望对你也有用。