Browse Source

Remove useless Android external permission check (#21628)

pull/21634/head
Julien Lebosquain 3 months ago
committed by GitHub
parent
commit
7467c0cf0f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs
  2. 43
      src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs

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

@ -118,7 +118,8 @@ internal abstract class AndroidStorageItem : IStorageBookmarkItem
protected async Task<bool> EnsureExternalFilesPermission(bool write) protected async Task<bool> EnsureExternalFilesPermission(bool write)
{ {
if (!_needsExternalFilesPermission) // Starting in API level 33, this permission has no effect.
if (!_needsExternalFilesPermission || OperatingSystem.IsAndroidVersionAtLeast(33))
{ {
return true; return true;
} }

43
src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs

@ -55,15 +55,20 @@ internal class AndroidStorageProvider : IStorageProvider
return null; 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); var javaFile = new JavaFile(androidUriPath);
if (javaFile.Exists() && javaFile.IsFile) if (javaFile.Exists() && javaFile.IsFile)
{ {
return null; return new AndroidStorageFile(_activity, androidUri);
} }
return new AndroidStorageFile(_activity, androidUri); return null;
} }
public async Task<IStorageFolder?> TryGetFolderFromPathAsync(Uri folderPath) public async Task<IStorageFolder?> TryGetFolderFromPathAsync(Uri folderPath)
@ -84,15 +89,13 @@ internal class AndroidStorageProvider : IStorageProvider
return null; return null;
} }
await EnsureUriReadPermission(androidUri);
var javaFile = new JavaFile(androidUriPath); var javaFile = new JavaFile(androidUriPath);
if (javaFile.Exists() && javaFile.IsDirectory) if (javaFile.Exists() && javaFile.IsDirectory)
{ {
return null; return new AndroidStorageFolder(_activity, androidUri, false);
} }
return new AndroidStorageFolder(_activity, androidUri, false); return null;
} }
public Task<IStorageFolder?> TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder) public Task<IStorageFolder?> TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder)
@ -284,30 +287,4 @@ internal class AndroidStorageProvider : IStorageProvider
return intent; 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);
}
}
} }

Loading…
Cancel
Save