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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:01:44