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
- Android 12及以下:
- 媒体库刷新:如果是刚添加到文件夹的视频,可能需要等待系统媒体库扫描完成才能查询到。可以用
MediaScannerConnection主动扫描文件:MediaScannerConnection.scanFile(ctx, new String[]{file.getAbsolutePath()}, null, (path, uri) -> { // 扫描完成后再执行查询 });
内容的提问来源于stack exchange,提问作者smeet variya
相关产品推荐
相关产品推荐

