You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Android端删除图库图片报Unknown URL错误的解决求助

解决.NET MAUI Android端删除图片时的Unknown URL异常

错误原因

你遇到的Java.Lang.IllegalArgumentException: Unknown URL异常,核心问题是传入ContentResolver.Delete的Uri格式不符合要求:
你直接将文件路径(如/storage/emulated/0/Pictures/MyApp/xxx.jpg)解析为Uri,但Android的ContentResolver只识别MediaStore提供的内容Uri(格式类似content://media/external/images/media/[图片ID]),文件路径Uri无法被系统处理,因此抛出异常。

修正方案

1. 调整查询字段,获取图片ID

修改查询的projection,加入MediaStore.Images.Media._ID字段,用于构建合法的内容Uri。

2. 构建正确的MediaStore内容Uri

遍历游标时,通过图片ID调用ContentUris.WithAppendedId生成符合要求的Uri,再执行删除操作。

3. 优化权限配置(可选)

  • Android 10(API 29)及以上,WRITE_EXTERNAL_STORAGE权限已被废弃,若仅操作自身应用创建的图片,无需申请MANAGE_EXTERNAL_STORAGE(该权限为特殊权限,需引导用户到系统设置手动开启)。
  • 确保权限请求逻辑适配目标Android版本。

修正后的代码

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;
// 新增_ID字段,用于构建合法内容Uri
var projection = new string[] { 
    MediaStore.Images.Media.InterfaceConsts.Data,
    MediaStore.Images.Media._ID 
};

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/"))
        {
            // 获取图片在MediaStore中的ID
            long imageId = cursor.GetLong(cursor.GetColumnIndexOrThrow(MediaStore.Images.Media._ID));
            // 构建符合要求的MediaStore内容Uri
            Android.Net.Uri imageUri = ContentUris.WithAppendedId(MediaStore.Images.Media.ExternalContentUri, imageId);
            
            // 执行删除操作
            int deleteCount = contentResolver.Delete(imageUri, null, null);
            // 可选:验证删除结果
            if(deleteCount > 0)
            {
                // 删除成功逻辑
            }
        }
    } while (cursor.MoveToNext());
}

cursor?.Close();
return true;

额外注意事项

  • 若你的应用运行在Android 10+,且图片是应用自身创建的,也可以直接通过文件路径删除文件,再调用MediaScannerConnection.ScanFile通知系统媒体库更新索引。
  • MANAGE_EXTERNAL_STORAGE权限仅在需要访问其他应用文件时才需申请,可通过Environment.IsExternalStorageManager检查权限状态,未开启则引导用户前往系统设置页面开启。

内容的提问来源于stack exchange,提问作者meeth_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:42:01