From 8ada76c1b651a7e885f3c8c059072bd6d77519be Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Sun, 5 Mar 2023 08:57:59 +0000 Subject: [PATCH] fix StorageFolder.GetItemsAsync on android --- .../Platform/Storage/AndroidStorageItem.cs | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs index 9d6dd46d0e..1baf7df4e3 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs @@ -138,7 +138,43 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder return Array.Empty(); } - using var javaFile = new JavaFile(Uri.Path!); + List files = new List(); + + var contentResolver = Activity.ContentResolver; + if (contentResolver == null) + { + return files; + } + + var childrenUri = DocumentsContract.BuildChildDocumentsUriUsingTree(Uri!, DocumentsContract.GetTreeDocumentId(Uri)); + + var projection = new[] + { + DocumentsContract.Document.ColumnDocumentId, + DocumentsContract.Document.ColumnMimeType + }; + if (childrenUri != null) + { + using var cursor = contentResolver.Query(childrenUri, projection, null, null, null); + + if (cursor != null) + while (cursor.MoveToNext()) + { + var mime = cursor.GetString(1); + var id = cursor.GetString(0); + var uri = DocumentsContract.BuildDocumentUriUsingTree(Uri!, id); + if (uri == null) + { + continue; + } + + files.Add(mime == DocumentsContract.Document.MimeTypeDir ? new AndroidStorageFolder(Activity, uri, false) : + new AndroidStorageFile(Activity, uri)); + } + } + + return files; + } // Java file represents files AND directories. Don't be confused. var files = await javaFile.ListFilesAsync().ConfigureAwait(false);