如何使用 Xamarin 和 Intent.ActionOpenDocumentTree 选择文件夹

问题描述 投票:0回答:1

我创建请求并使用以下命令在我的 SD 卡上选择一个文件夹:

Intent intent = new Intent(Intent.ActionOpenDocumentTree);
intent.PutExtra("android.content.extra.SHOW_ADVANCED", true);
intent.PutExtra("android.content.extra.FANCY", true);
intent.PutExtra("android.content.extra.SHOW_FILESIZE", true);
this.StartActivityForResult(intent, SELECT_FOLDER_REQUEST);

然后我使用这个得到结果路径:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == SELECT_FOLDER_REQUEST)
    {
        if (resultCode == Result.Ok)
        {
            string chosenPath = data.Data.toString();
            
            
        }
    }
}

问题是 selectedPath 包含:

content://com.android.externalstorage.documents/tree/3081-9B2D%3AMyFolder

当我需要类似的东西时:

/storage/3081-9B2D/MyFolder

我可以手动编辑字符串,但这在其他设备上可能会出现问题。

我尝试过使用

ContentResolver.Query
,但它说 uri 无效。

在 xamarin 中使用 Intent.ActionOpenDocumentTree 获取用户选择的文件夹的正确方法是什么?

android xamarin directory uri action-open-document-tree
1个回答
0
投票

首先,我建议你还是使用DocumentFile api,而不是在使用

Intent.ActionOpenDocumentTree
时尝试获取真实路径:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == SELECT_FOLDER_REQUEST)
    {
        if (resultCode == Result.Ok)
        {
             DocumentFile documentFile = DocumentFile.FromTreeUri(this,data.Data);
            if (documentFile.IsDirectory)
            {
               // do something
            }else{
               //do something
            }
        }
    }
}

您可以使用

DocumentFile.CreateFile()
在文件夹中创建新文件并对其进行读取或写入。我将展示有关创建和编写的示例:

if (documentFile.IsDirectory)
{
    var file = documentFile.CreateFile("text/*", "test.txt");
    var output = ContentResolver.OpenOutputStream(file.Uri);
    var writer = new BufferedWriter(new OutputStreamWriter(output));
    writer.Write("test to write");
    writer.Close();
}

如果你还想从文档文件中获取真实路径,可以参考这个帖子:如何使用 ACTION_OPEN_DOCUMENT_TREE Intent 获取真实路径

© www.soinside.com 2019 - 2024. All rights reserved.