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)