Browse Source

fix StorageFolder.GetItemsAsync on android

pull/10558/head
Emmanuel Hansen 3 years ago
parent
commit
8ada76c1b6
  1. 38
      src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs

38
src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs

@ -138,7 +138,43 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder
return Array.Empty<IStorageItem>();
}
using var javaFile = new JavaFile(Uri.Path!);
List<IStorageItem> files = new List<IStorageItem>();
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);

Loading…
Cancel
Save