diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs index a5ceb02312..fa26e0cac7 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs @@ -118,7 +118,8 @@ internal abstract class AndroidStorageItem : IStorageBookmarkItem protected async Task EnsureExternalFilesPermission(bool write) { - if (!_needsExternalFilesPermission) + // Starting in API level 33, this permission has no effect. + if (!_needsExternalFilesPermission || OperatingSystem.IsAndroidVersionAtLeast(33)) { return true; } diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs index b42d0f7aaa..b1fc61684f 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs @@ -55,15 +55,20 @@ internal class AndroidStorageProvider : IStorageProvider return null; } - await EnsureUriReadPermission(androidUri); + // About the READ_EXTERNAL_STORAGE permission: + // https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE + // - "Starting in API level 33, this permission has no effect." + // - "Also starting in API level 19, this permission is not required + // to read or write files in your application-specific directories [...]" + // Consequently, we don't try to check for that permission here anymore. var javaFile = new JavaFile(androidUriPath); if (javaFile.Exists() && javaFile.IsFile) { - return null; + return new AndroidStorageFile(_activity, androidUri); } - return new AndroidStorageFile(_activity, androidUri); + return null; } public async Task TryGetFolderFromPathAsync(Uri folderPath) @@ -84,15 +89,13 @@ internal class AndroidStorageProvider : IStorageProvider return null; } - await EnsureUriReadPermission(androidUri); - var javaFile = new JavaFile(androidUriPath); if (javaFile.Exists() && javaFile.IsDirectory) { - return null; + return new AndroidStorageFolder(_activity, androidUri, false); } - return new AndroidStorageFolder(_activity, androidUri, false); + return null; } public Task TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder) @@ -284,30 +287,4 @@ internal class AndroidStorageProvider : IStorageProvider return intent; } - - private async Task EnsureUriReadPermission(AndroidUri androidUri) - { - bool hasPerms = false; - Exception? innerEx = null; - try - { - hasPerms = _activity.CheckUriPermission(androidUri, - global::Android.OS.Process.MyPid(), - global::Android.OS.Process.MyUid(), - ActivityFlags.GrantReadUriPermission) - == global::Android.Content.PM.Permission.Granted; - - // TODO: call RequestPermission or add proper permissions API, something like in Browser File API. - hasPerms = hasPerms || await _activity.CheckPermission(Manifest.Permission.ReadExternalStorage); - } - catch (Exception ex) - { - innerEx = ex; - } - - if (!hasPerms) - { - throw new InvalidOperationException("Application doesn't have READ_EXTERNAL_STORAGE permission. Make sure android manifest has this permission defined and user allowed it.", innerEx); - } - } }