diff --git a/BrickController2/BrickController2.Android/PlatformServices/Permission/ReadWriteExternalStoragePermission.cs b/BrickController2/BrickController2.Android/PlatformServices/Permission/ReadWriteExternalStoragePermission.cs
index d5a22f5d..26ecc0dd 100644
--- a/BrickController2/BrickController2.Android/PlatformServices/Permission/ReadWriteExternalStoragePermission.cs
+++ b/BrickController2/BrickController2.Android/PlatformServices/Permission/ReadWriteExternalStoragePermission.cs
@@ -1,5 +1,5 @@
-using System.Collections.Generic;
-using Android;
+using Android;
+using Android.OS;
using static Microsoft.Maui.ApplicationModel.Permissions;
using BrickController2.PlatformServices.Permission;
@@ -7,10 +7,15 @@ namespace BrickController2.Droid.PlatformServices.Permission
{
public class ReadWriteExternalStoragePermission : BasePlatformPermission, IReadWriteExternalStoragePermission
{
- public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
- {
- (Manifest.Permission.ReadExternalStorage, true),
- (Manifest.Permission.WriteExternalStorage, true)
- }.ToArray();
+ public override (string androidPermission, bool isRuntime)[] RequiredPermissions => (Build.VERSION.SdkInt <= BuildVersionCodes.SV2) ?
+ // Android API 32 and older - ask for permissions
+ new (string androidPermission, bool isRuntime)[]
+ {
+ (Manifest.Permission.ReadExternalStorage, true),
+ (Manifest.Permission.WriteExternalStorage, true)
+ } :
+ // Android API 33+ does not support permissions to external storage
+ // Let it be Granted (via empty permission list)
+ [];
}
}
\ No newline at end of file
diff --git a/BrickController2/BrickController2.Android/PlatformServices/SharedFileStorage/SharedFileStorageService.cs b/BrickController2/BrickController2.Android/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
index 9fa4c8b0..87612a6f 100644
--- a/BrickController2/BrickController2.Android/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
+++ b/BrickController2/BrickController2.Android/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
@@ -1,4 +1,5 @@
-using BrickController2.Helpers;
+using Android.OS;
+using BrickController2.Helpers;
using BrickController2.PlatformServices.SharedFileStorage;
using System;
using System.IO;
@@ -25,18 +26,44 @@ public bool IsPermissionGranted
}
}
- public string? SharedStorageDirectory
+ public string? SharedStorageBaseDirectory
{
get
{
try
{
#pragma warning disable CS0618 // Type or member is obsolete
- var storageDirectory = Environment.ExternalStorageDirectory?.AbsolutePath;
+ var storageDirectory = (Build.VERSION.SdkInt <= BuildVersionCodes.SV2) ?
+ // Android API 32 and older - keep backward compatible: /storage/emulated/0/
+ Environment.ExternalStorageDirectory?.AbsolutePath :
+ // Android API 33+ - use /storage/emulated/0/Documents
+ Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments)?.AbsolutePath;
var storageState = Environment.ExternalStorageState;
#pragma warning restore CS0618 // Type or member is obsolete
- if (storageDirectory is null || !Directory.Exists(storageDirectory) || !Environment.MediaMounted.Equals(storageState))
+ if (storageDirectory == null || !Directory.Exists(storageDirectory) || !Environment.MediaMounted.Equals(storageState))
+ {
+ return null;
+ }
+
+ return storageDirectory;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+ }
+
+ public string? SharedStorageDirectory
+ {
+ get
+ {
+ try
+ {
+ var storageDirectory = SharedStorageBaseDirectory;
+
+ if (storageDirectory == null)
{
return null;
}
diff --git a/BrickController2/BrickController2.Android/Properties/AndroidManifest.xml b/BrickController2/BrickController2.Android/Properties/AndroidManifest.xml
index 86499111..8093b5ea 100644
--- a/BrickController2/BrickController2.Android/Properties/AndroidManifest.xml
+++ b/BrickController2/BrickController2.Android/Properties/AndroidManifest.xml
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/BrickController2/BrickController2.iOS/PlatformServices/SharedFileStorage/SharedFileStorageService.cs b/BrickController2/BrickController2.iOS/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
index 967f370e..2fd9cad6 100644
--- a/BrickController2/BrickController2.iOS/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
+++ b/BrickController2/BrickController2.iOS/PlatformServices/SharedFileStorage/SharedFileStorageService.cs
@@ -21,7 +21,9 @@ public bool IsPermissionGranted
}
}
- public string? SharedStorageDirectory
+ public string? SharedStorageDirectory => SharedStorageBaseDirectory;
+
+ public string? SharedStorageBaseDirectory
{
get
{
diff --git a/BrickController2/BrickController2/PlatformServices/SharedFileStorage/ISharedFileStorageService.cs b/BrickController2/BrickController2/PlatformServices/SharedFileStorage/ISharedFileStorageService.cs
index cb0c84c9..2acf99b7 100644
--- a/BrickController2/BrickController2/PlatformServices/SharedFileStorage/ISharedFileStorageService.cs
+++ b/BrickController2/BrickController2/PlatformServices/SharedFileStorage/ISharedFileStorageService.cs
@@ -6,6 +6,8 @@ public interface ISharedFileStorageService
bool IsPermissionGranted { get; set; }
+ string? SharedStorageBaseDirectory { get; }
+
string? SharedStorageDirectory { get; }
}
}
diff --git a/BrickController2/BrickController2/UI/ViewModels/CreationListPageViewModel.cs b/BrickController2/BrickController2/UI/ViewModels/CreationListPageViewModel.cs
index c0a2a33b..b70c3768 100644
--- a/BrickController2/BrickController2/UI/ViewModels/CreationListPageViewModel.cs
+++ b/BrickController2/BrickController2/UI/ViewModels/CreationListPageViewModel.cs
@@ -124,7 +124,7 @@ await _dialogService.ShowMessageBoxAsync(
_disappearingTokenSource?.Token.ThrowIfCancellationRequested();
}
- if (SharedFileStorageService.SharedStorageDirectory != null)
+ if (SharedFileStorageService.SharedStorageBaseDirectory != null)
{
var storagePermissionStatus = await _readWriteExternalStoragePermission.CheckStatusAsync();
if (storagePermissionStatus != PermissionStatus.Granted && !_isStoragePermissionRequested)