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.
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.