我希望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中创建快捷方式(见图)?还是如何通过例如ACTION_CREATE_DOCUMENT来使SAF“在指定文档中启动导航器(如果它是文件夹)”? (如果我没记错的话,这些功能在Windows 95中就存在,例如:>)
编辑: 我删除了一些到git-project的链接,因为最终出现了@A Jar Clay提示的“ link-rot”。
我也确实尝试过将ACTION_OPEN_DOCUMENT_TREE中的树Uri(建议@CommonsWare)传递到方法intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsTreeUri);
上。但是SAF并不是从我作为Uri经过的位置开始的。 :(
答案 0 :(得分: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一起使用是无效的,但是在上述过程之后有效。
无论如何,为我工作,希望它也对您有用。