Explorar o código

Merge pull request #10558 from AvaloniaUI/android-list-files

Android - Fix StorageFolder.GetItemsAsync failing to get children on android
Max Katz %!s(int64=2) %!d(string=hai) anos
pai
achega
cea3496341

+ 33 - 17
src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs

@@ -138,27 +138,43 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder
             return Array.Empty<IStorageItem>();
         }
 
-        using var javaFile = new JavaFile(Uri.Path!);
+        List<IStorageItem> files = new List<IStorageItem>();
 
-        // Java file represents files AND directories. Don't be confused.
-        var files = await javaFile.ListFilesAsync().ConfigureAwait(false);
-        if (files is null)
+        var contentResolver = Activity.ContentResolver;
+        if (contentResolver == null)
         {
-            return Array.Empty<IStorageItem>();
+            return files;
         }
 
-        return files
-            .Select(f => (file: f, uri: AndroidUri.FromFile(f)))
-            .Where(t => t.uri is not null)
-            .Select(t => t.file switch
-            {
-                { IsFile: true } => (IStorageItem)new AndroidStorageFile(Activity, t.uri!),
-                { IsDirectory: true } => new AndroidStorageFolder(Activity, t.uri!, false),
-                _ => null
-            })
-            .Where(i => i is not null)
-            .ToArray()!;
-    }
+        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;
+    }       
 }
 
 internal sealed class WellKnownAndroidStorageFolder : AndroidStorageFolder