Flutter中Glob检索MP3文件无结果,相关日志含义咨询
MP3文件检索无结果排查与日志解释
一、文件检索无结果的排查方案
你的代码存在几个可能导致无返回结果的问题,逐一排查:
1. Glob匹配模式的大小写问题
你使用的"**.mp3"是大小写敏感的,如果目标目录下存在.MP3大写后缀的文件,会匹配失败。修改为大小写不敏感的模式:
Stream<File> searchAudioFiles(Directory dir) { return Glob("**.mp3", caseSensitive: false) .list(root: dir.path) .where((entity) => entity is File) .cast<File>(); }
也可以用通配符兼容大小写:"**.[mM][pP]3"。
2. Android存储权限缺失
Android 10及以上版本对外部存储访问有严格限制:
- Android 13+:需要申请
READ_MEDIA_AUDIO权限 - Android 10-12:需要申请
READ_EXTERNAL_STORAGE权限,若访问公共目录(如Download、Music),可能需要用MediaStore API而非直接文件路径访问 - 若需访问任意目录,还需申请
MANAGE_EXTERNAL_STORAGE权限(需在应用商店说明用途)
确认你已在AndroidManifest.xml中声明权限,并完成运行时动态申请。
3. 目标目录路径错误
先打印dir.path确认传入的目录是否正确,手动检查该目录下是否确实存在MP3文件。比如如果传入的是应用私有目录,而MP3文件在公共存储,自然无法找到。
4. Glob递归逻辑验证
虽然**理论上匹配任意子目录,但部分版本的glob包可能需要显式指定递归:
Glob("**.mp3").list(root: dir.path, recursive: true)
5. 文件实体判断优化
增加存在性检查,避免匹配到已删除或无效的文件实体:
.where((entity) => entity is File && entity.existsSync())
二、日志含义解释
你看到的两条日志和文件检索功能无关:
I/ExoPlayerImpl(23190): Init 85a779e [ExoPlayerLib/2.17.1] [TECNO-KD7, TECNO KD7, TECNO MOBILE LIMITED, 29]:这是ExoPlayer库的初始化日志,说明你的应用中使用了ExoPlayer(版本2.17.1),并在TECNO-KD7设备上完成了一个播放器实例的初始化,属于正常信息日志。W/ons.luja(23190): Accessing hidden method Landroid/media/AudioTrack;->getLatency()I (greylist, reflection, allowed):这是Android系统的警告日志,提示应用通过反射调用了系统隐藏的AudioTrack.getLatency()方法。该方法属于灰名单API,当前允许反射调用,但未来版本可能被限制,一般是ExoPlayer内部逻辑触发,无需手动处理。
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

