Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更好地控制Android SAF UI(例如,操作\打开\文档)?_Android_Android Intent_Android Contentprovider_Storage Access Framework - Fatal编程技术网

如何更好地控制Android SAF UI(例如,操作\打开\文档)?

如何更好地控制Android SAF UI(例如,操作\打开\文档)?,android,android-intent,android-contentprovider,storage-access-framework,Android,Android Intent,Android Contentprovider,Storage Access Framework,我希望SAF“在指定的文档中启动导航器,如果它是一个文件夹”(就像他们在文档中所说的那样) 这不起作用,因此我还想知道是否可以将存储快捷方式添加到SAF UI。请参见此链接上的图片: 但是我认为在一个特定的文件夹中启动SAF UI更可能,所以我现在可能会采用这种方法。我已经在onCreate(…)-方法中尝试过这一点: String pathAsString = Environment.getExternalStorageDirectory() + "/myscientificapp/measu

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

这不起作用,因此我还想知道是否可以将存储快捷方式添加到SAF UI。请参见此链接上的图片:

但是我认为在一个特定的文件夹中启动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);
问题是它不起作用。。或者我不知道怎么做/

我读过一些关于这些地方的书。例如,一位开发人员说:

当使用“创建文档”操作选择保存文件的位置或打开文档时,新的额外初始URI允许您使用自己的自定义起始位置覆盖默认初始位置(用户选择的最后一个位置)

在Android文档中,我们可以看到:

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

我们也可以在以下网址阅读:

额外的首字母URI


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

如果缺少此额外位置或document navigator未能找到所需的初始位置,则初始位置是系统特定的

高度抽象的语言非常出色,但我想至少了解一些如何使用此功能的细节


但是在这里,一些开发者告诉我们

还有一些

因此,根据一些消息来源,这应该是可行的

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

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

我还尝试将一个树Uri(如@commonware推荐的)从ACTION_OPEN_DOCUMENT_tree传递到方法
intent.putExtra(DocumentsContract.EXTRA_INITIAL_Uri,pathAsTreeUri)。但是SAF没有在我作为Uri传递的位置启动:(

亚历克斯·贝克的这首歌对我很有用,我觉得它对你也很有用

DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());
从ACTION\u OPEN\u DOCUMENT\u树获得的resultData.getData()是从fromTreeUri()开始的uri

在“Location应该指定一个文档URI或一个带有文档ID的树URI”中看起来很像。“带有文档ID”似乎很重要。我可以直接使用ACTION\u OPEN\u document中的resultData.getData(),它可以工作。直接使用ACTION\u OPEN\u document\u tree中的resultData.getData不起作用,但在上述过程之后工作


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

“但是在Stackoverflow上,一些开发人员告诉我们它不起作用”--你不能打开文件系统路径,这就是问题所在。
EXTRA\u INITIAL\u URI
的文档说明:“位置应该指定文档URI或具有文档ID的树URI”。您试图传入一个文件系统路径,但该路径不起作用。如果您以前从SAF获得了一个
Uri
,您可以通过
EXTRA\u INITIAL\u Uri
提供它,这可能会很荣幸。为了避免链接损坏,将您链接的GitHub代码的相关部分移到这个问题中会很有帮助,并可能有助于澄清确切地说,您正在寻找什么?这似乎不适用于外部存储。当指定这些URI中的任何一个时,SAF都不会在所需的位置打开。示例-1)content://com.android.externalstorage.documents/document/ 2) content://com.android.externalstorage.documents/document/data.txt
DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());