Flutter开发媒体播放器:读取设备存储及SD卡含视频目录
实现媒体播放器的目录筛选功能
核心思路
- 先获取设备内部存储和SD卡的有效根路径
- 递归遍历所有目录,检查目录下是否存在视频格式文件
- 收集符合条件的目录,去重后展示
具体实现步骤
1. 获取存储路径
首先要处理存储权限,再获取内部存储和SD卡的路径:
- Android 10及以下需动态申请
READ_EXTERNAL_STORAGE权限;Android 11+需申请MANAGE_EXTERNAL_STORAGE权限,部分场景可通过媒体库API规避 - 获取路径的示例代码:
// 内部存储路径 File internalStorage = Environment.getExternalStorageDirectory(); // 收集所有外部存储(含SD卡)路径 List<File> storagePaths = new ArrayList<>(); StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { List<StorageVolume> volumes = storageManager.getStorageVolumes(); for (StorageVolume volume : volumes) { // 判断是否为可移除的SD卡 if (volume.isRemovable()) { File sdCardDir = volume.getDirectory(); if (sdCardDir != null && sdCardDir.exists()) { storagePaths.add(sdCardDir); } } } } // 加入内部存储路径 storagePaths.add(internalStorage);
2. 遍历筛选含视频的目录
递归遍历每个存储路径下的子目录,检查是否包含视频文件:
- 先定义支持的视频格式集合:
private static final Set<String> VIDEO_EXTENSIONS = new HashSet<>(Arrays.asList("mp4", "mkv", "avi", "mov", "flv", "wmv"));
- 递归扫描方法:
private void scanValidDirs(File dir, List<File> validDirList) { if (!dir.exists() || !dir.isDirectory()) return; boolean hasVideo = false; File[] files = dir.listFiles(); if (files != null) { // 检查当前目录下的文件是否有视频格式 for (File file : files) { if (file.isFile()) { String ext = getFileExtension(file.getName()).toLowerCase(); if (VIDEO_EXTENSIONS.contains(ext)) { hasVideo = true; break; } } } } // 当前目录含视频则加入列表 if (hasVideo) { validDirList.add(dir); } // 递归遍历子目录 File[] subDirs = dir.listFiles(File::isDirectory); if (subDirs != null) { for (File subDir : subDirs) { scanValidDirs(subDir, validDirList); } } } // 获取文件扩展名 private String getFileExtension(String fileName) { int dotIndex = fileName.lastIndexOf('.'); return dotIndex == -1 ? "" : fileName.substring(dotIndex + 1); }
3. 展示筛选结果
把收集到的目录列表展示到UI组件(比如RecyclerView):
- 给
RecyclerView设置自定义适配器,绑定目录名称和路径 - 点击目录项可跳转至该目录的视频列表页面
注意事项
- 性能优化:扫描操作放在子线程执行,避免阻塞UI;可加入进度提示
- 权限兼容:Android 13+针对媒体文件有更细分权限,需按需申请
READ_MEDIA_VIDEO - 去重处理:避免符号链接或重复挂载导致的目录重复添加
- 格式扩展:可根据需求新增更多视频格式到扩展集合中
内容的提问来源于stack exchange,提问作者Marwan Abdelwahab
相关产品推荐
相关产品推荐

