我创建请求并使用以下命令在我的 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 获取用户选择的文件夹的正确方法是什么?
首先,我建议你还是使用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 获取真实路径。