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

Android中使用MediaStore查询特定文件夹时Cursor返回空的问题

解决MediaStore Query特定文件夹视频返回空Cursor的问题

Hey,我帮你排查了下代码,你的Cursor一直返回空结果主要有几个关键问题,咱们一步步来修正:

1. LIKE查询缺少通配符

你当前的selection语句是MediaStore.Video.Media.DATA + " like?",但selectionArgs里只传了文件夹路径。LIKE操作符需要通配符%才能匹配该文件夹下的所有文件——不然它只会找路径完全等于这个文件夹字符串的条目,而实际视频文件的路径是文件夹路径/文件名,自然匹配不到。

2. 投影数组语法错误

你的projection数组里MediaStore.Video.Media._ID后面少了逗号,这会导致编译错误,虽然你说Cursor能拿到计数0,可能是笔误,但这个必须修正。

3. Android版本适配(API 29+)

从Android 10开始,MediaStore.Video.Media.DATA字段被废弃,而且直接访问外部存储路径的方式受到限制,推荐使用RELATIVE_PATH来查询特定文件夹,这样更符合系统的存储规范。


修正后的代码(适配API <29)

File file = new File(Environment.getExternalStorageDirectory() + "/myplayer/");
if (file.isDirectory()) {
    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    // 修正投影数组的逗号问题
    String[] projection = { 
        MediaStore.Video.Media._ID,
        MediaStore.Video.Media.DURATION, 
        MediaStore.Video.Media.DATA, 
        MediaStore.Video.Media.DISPLAY_NAME, 
        MediaStore.Video.Media.SIZE, 
        MediaStore.Video.Media.ALBUM 
    };
    // 添加通配符%,匹配文件夹下所有文件
    String selection = MediaStore.Video.Media.DATA + " LIKE ?";
    String[] selectionArgs = new String[]{file.getAbsolutePath() + "/%"};
    Cursor cursor = ctx.getContentResolver().query(uri, projection, selection, selectionArgs, null);
    if (cursor != null) {
        Log.d("trace cursor", "not null");
        Log.d("trace count", "" + cursor.getCount());
        // 用完记得关闭Cursor,避免内存泄漏
        cursor.close();
    }
}

推荐写法(适配API 29+)

Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] projection = { 
    MediaStore.Video.Media._ID,
    MediaStore.Video.Media.DURATION, 
    MediaStore.Video.Media.DISPLAY_NAME, 
    MediaStore.Video.Media.SIZE, 
    MediaStore.Video.Media.ALBUM,
    MediaStore.Video.Media.RELATIVE_PATH
};
// 使用RELATIVE_PATH匹配特定文件夹,路径为相对于外部存储的相对路径
String selection = MediaStore.Files.FileColumns.RELATIVE_PATH + " LIKE ?";
// 如果你的myplayer在外部存储根目录,用"myplayer/%";如果在Movies目录下,用"Movies/myplayer/%"
String[] selectionArgs = new String[]{"myplayer/%"};
Cursor cursor = ctx.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null) {
    Log.d("trace cursor", "not null");
    Log.d("trace count", "" + cursor.getCount());
    cursor.close();
}

额外注意事项

  • 权限检查:确保已经申请了对应权限:
    • Android 12及以下:READ_EXTERNAL_STORAGE
    • Android 13+:READ_MEDIA_VIDEO
  • 媒体库刷新:如果是刚添加到文件夹的视频,可能需要等待系统媒体库扫描完成才能查询到。可以用MediaScannerConnection主动扫描文件:
    MediaScannerConnection.scanFile(ctx, new String[]{file.getAbsolutePath()}, null,
        (path, uri) -> {
            // 扫描完成后再执行查询
        });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:20:40