如何简化MediaStore查询语句并筛选特定大小以上的全部文件
Android MediaStore 查询优化与文件大小筛选
简化Selection字符串
你原来的写法逐个枚举媒体类型,不仅冗余还容易出现语法错误(比如代码里OR前面没加空格,会导致SQL语法错误)。可以用SQL的IN操作符简化,把所有需要包含的媒体类型一次性列出来,同时推荐用selectionArgs传递参数,避免硬编码的潜在问题:
// 简化后的selection,用IN包含所有目标媒体类型 String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + " IN (?, ?, ?, ?)"; // 对应selection的参数,依次为无媒体类型、图片、视频、音频 String[] selectionArgs = new String[]{ String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_NONE), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_AUDIO) };
添加文件大小筛选
要筛选大于特定大小的文件,只需在selection中添加AND条件判断SIZE列大于目标值,同时将大小参数加入selectionArgs。以下是完整示例(以筛选大于1MB的文件为例):
ContentResolver cr = context.getContentResolver(); Uri uri = MediaStore.Files.getContentUri("external"); // 只查询需要的列,避免性能浪费 String[] projection = new String[]{ MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.MEDIA_TYPE }; long minFileSize = 1024 * 1024; // 1MB,可按需修改 // 组合媒体类型筛选和大小筛选条件 String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + " IN (?, ?, ?, ?) AND " + MediaStore.Files.FileColumns.SIZE + " > ?"; String[] selectionArgs = new String[]{ String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_NONE), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO), String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_AUDIO), String.valueOf(minFileSize) }; // 可选:按文件大小降序排序 String sortOrder = MediaStore.Files.FileColumns.SIZE + " DESC"; Cursor allFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder);
额外注意事项
- 不要将
projection设为null,这会查询所有列造成性能浪费,只查询实际需要的字段即可。 - 权限要求:Android 10及以上版本需申请
READ_EXTERNAL_STORAGE权限;Android 13+查询全部文件仍需该权限,细分媒体类型权限仅针对单独类型查询生效。
内容的提问来源于stack exchange,提问作者lanezalbryt
相关产品推荐
相关产品推荐

