Search code examples
c#maui

Android - How do I delete an image from Gallery in .NET MAUI?


I am trying to delete an image programmatically using .NET MAUI, but I get this error:

{Java.Lang.IllegalArgumentException: Unknown URL /storage/emulated/0/Pictures/MyApp/7b7dc4c5d3a64ecdaa2b1d588bbfe1b51.jpg
   at Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualIntMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net7.0/JniEnvironment.g.cs:line 20647
   at Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeNonvirtualInt32Method(String encodedMember, IJavaPeerable self, JniArgumentValue* parameters) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:line 538
   at Android.Content.ContentResolver.Delete(Uri url, String where, String[] selectionArgs) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-34/mcw/Android.Content.ContentResolver.cs:line 802
   at MyApp.MAUI.Platforms.AndroidServices.SavePictureService.DeletePicture() in C:\Users\OoPer\source\repos\MyApp_Clear_Images_And_Copy_To_Gallery\MyApp.MAUI\Platforms\Android\SavePictureService.cs:line 58
}

Here is my code:

PermissionStatus statusWrite = await Permissions.RequestAsync<Permissions.StorageWrite>();
PermissionStatus statusRead = await Permissions.RequestAsync<Permissions.StorageRead>();

PermissionStatus statusPhotos = await Permissions.RequestAsync<Permissions.Photos>();

var uri = MediaStore.Images.Media.ExternalContentUri;
var projection = new string[] { MediaStore.Images.Media.InterfaceConsts.Data };

var contentResolver = Application.Context.ContentResolver;
var cursor = contentResolver.Query(uri, projection, null, null, null);
if (cursor != null && cursor.MoveToFirst())
{
    do
    {
        var imagePath = cursor.GetString(cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Data));
        if (imagePath.Contains("/MyApp/"))
        {
            Android.Net.Uri imageUri = Android.Net.Uri.Parse(imagePath.ToString());

            contentResolver.Delete(imageUri, null, null);
        }
    } while (cursor.MoveToNext());
}

cursor?.Close();

return true;

My permissions in AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

The code fails at contentResolver.Delete(imageUri, null, null);

I am expecting the image to be deleted from the Gallery, but it does not and I have the above error.


Solution

  • Android.Net.Uri imageUri = Android.Net.Uri.Parse(imagePath.ToString());

    This method converts a string (like a file path) into a URI object. However, a file path like /storage/emulated/0/Pictures/MyApp/7b7dc4c5d3a64ecdaa2b1d588bbfe1b51.jpg is not a Content URI. It is a file URI or a local file path, which ContentResolver does not understand when attempting operations like deletion.

    You can try something like below instead

    var imagePath = cursor.GetString(cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Data));
    var imageId = cursor.GetString(cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Id));
    if (imagePath.Contains("/MyApp/"))
    {
        Android.Net.Uri imageUri = Android.Net.Uri.WithAppendedPath(MediaStore.Images.Media.ExternalContentUri, imageId);
        contentResolver.Delete(imageUri, null, null);
    }
    

    This method constructs a Content URI that Android's ContentResolver can recognize.