Android使用MediaStore查询图片和视频无返回结果问题求助
可行解决方案
核心问题修复
你代码中最直接的错误是selectionArgs的类型不匹配,这是导致查询无结果的首要原因:MediaStore.Files.IFileColumns.MediaType字段在系统媒体库中存储的是整型枚举值:MediaType.Image对应值为1,MediaType.Video对应值为3。你当前将枚举直接调用ToString()得到的是字符串"Image"/"Video",完全无法和数据库中的整型值匹配,因此查询不到任何结果。
同时注意你贴出的代码中selectionArgs行末尾多了一个多余的闭合大括号,会直接导致编译失败。
修复后的代码段如下:
// 修复前:var selectionArgs = new [] { MediaType.Image.ToString(), MediaType.Video.ToString() } }; // 修复后: var selectionArgs = new [] { ((int)MediaType.Image).ToString(), ((int)MediaType.Video).ToString() };
系统版本兼容修复
权限适配
- Android 13(API 33)及以上:旧的
READ_EXTERNAL_STORAGE权限已经失效,必须动态申请READ_MEDIA_IMAGES、READ_MEDIA_VIDEO两个权限,用户同意后才能查询媒体库 - Android 10(API 29):如果你的应用目标SDK为29,需要在
AndroidManifest.xml的Application节点添加属性android:requestLegacyExternalStorage="true"临时关闭分区存储限制,否则仅能查询到本应用创建的媒体资源 - Android 9及更低版本:确认已经动态申请
READ_EXTERNAL_STORAGE权限且用户已授权
空值异常防护
ContentResolver.Query在查询异常时可能返回null,直接调用GetColumnIndexOrThrow会触发崩溃,需要先做合法性判断:
var mediaCursor = ContentResolver.Query(uri, projection, selection, selectionArgs, $"{MediaStore.Images.Media.InterfaceConsts.DateTaken} DESC"); // 新增空判断 if (mediaCursor == null || mediaCursor.Count == 0) { return galleryItems; } // 原有获取列索引逻辑
排序字段兼容
如果修复后仍有部分设备查询不到结果,可以将排序字段替换为MediaStore.Files.IFileColumns.DateAdded DESC,部分非相机拍摄的媒体资源可能没有DateTaken字段值,会导致排序异常过滤掉结果。
内容的提问来源于stack exchange,提问作者Eman
相关产品推荐
相关产品推荐

