【问题标题】:How to get more control over Android SAF UI (e.g ACTION_OPEN_DOCUMENT)?如何更好地控制 Android SAF UI(例如 ACTION_OPEN_DOCUMENT)?
【发布时间】:2019-06-12 22:50:10
【问题描述】:

我希望 SAF “在指定文档中启动导航器(如果它是一个文件夹)”(正如他们在文档中所说的那样)。

这不起作用,所以我也想知道是否可以将存储快捷方式添加到 SAF UI。在此链接查看图片:https://i.imgur.com/yGtcGMM.jpg

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

String pathAsString = Environment.getExternalStorageDirectory() + "/myscientificapp/measurements/";
File pathAsFile = new File(pathAsString);

if (pathAsFile.exists()) { Log.d(TAG, "pathAsFile exists!"); } //This is printed in Logcat

android.net.Uri pathAsUri = Uri.fromFile(pathAsFile);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsUri); //Does not make effect
startActivityForResult(intent, REQUEST_OPEN_DOCUMENT);

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

我已经阅读了一些关于这些地方的信息。例如,在Medium.com,一位开发人员说:

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

在 Android 文档中,我们可以阅读到 EXTRA_INITIAL_URI

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

我们也可以在DocumentsContract#EXTRA_INITIAL_URI阅读它:

EXTRA_INITIAL_URI

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

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

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

但在 Stackoverflow 上,一些开发人员告诉我们it will not work

还有一些threads are not really answered yet

因此,根据某些消息来源,它应该可以工作。

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

编辑: 由于@A Jar of Clay 暗示的最终“链接腐烂”,我删除了一些指向 git-project 的链接。

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

【问题讨论】:

  • “但是在 Stackoverflow 上,一些开发人员告诉我们它不起作用”——你不能打开文件系统路径,这就是那个问题的意义所在。 EXTRA_INITIAL_URI 的文档指出:“位置应指定文档 URI 或带有文档 ID 的树 URI”。您正在尝试传入文件系统路径,但该路径不起作用。不过,如果您之前从 SAF 获得了Uri,您可以通过EXTRA_INITIAL_URI 提供它,它可能会被兑现。
  • 为避免链接失效,将您链接到此问题的 GitHub 代码的相关部分移动会有所帮助,并且可能有助于明确您在寻找什么?
  • 这似乎不适用于外部存储。当指定其中任何一个 Uris 时,SAF 不会在所需位置打开。示例 - 1) content://com.android.externalstorage.documents/document/ 2) content://com.android.externalstorage.documents/document/data.txt

标签: android android-intent android-contentprovider storage-access-framework


【解决方案1】:

Alex Baker 的 answer 为我工作,我认为它也适合你。

DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());

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

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

无论如何,对我有用,希望它也对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多