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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:51:03