Android使用LexiLabs Sound库播放M4A文件遇ENOENT文件不存在错误求助
问题描述
播放M4A格式媒体文件时触发ENOENT(无此文件或目录)错误,具体异常栈如下:
FATAL EXCEPTION: main Process: io.eduonline.devrush.devrushlmsmultiplatform.androidApp, PID: 21917 java.io.FileNotFoundException: OUR6G_IgJkCvBg5qurB2Ag/audios/FpHO919GeEOCgM52fnuq9g.m4a: open failed: ENOENT (No such file or directory) at libcore.io.IoBridge.open(IoBridge.java:574) at java.io.FileInputStream.(FileInputStream.java:160) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1235) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1213) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1178) at app.lexilabs.basic.sound.Audio.load(Audio.android.kt:54)
使用LexiLabs basic-sound库,相关代码:
val audio = Audio(audioUrl, false)
其中audioUrl = OUR6G_IgJkCvBg5qurB2Ag/audios/FpHO919GeEOCgM52fnuq9g.m4a
解决方案
1. 修正文件路径格式
当前audioUrl是相对路径,Android无法识别未指定根目录的路径,必须使用绝对路径:
- 若文件在应用内部存储,路径示例:
val absolutePath = context.filesDir.path + "/OUR6G_IgJkCvBg5qurB2Ag/audios/FpHO919GeEOCgM52fnuq9g.m4a" - 若文件在外部存储,需使用外部存储根目录拼接路径,同时确保已申请对应权限。
2. 验证文件实际存在
在加载前先检查文件是否存在,避免无意义的加载操作:
val audioFile = File(absoluteAudioPath) if (!audioFile.exists()) { // 处理文件不存在的情况,比如提示用户或重新下载 return } val audio = Audio(audioFile.path, false)
也可以通过Android Studio的Device File Explorer直接查看对应路径下是否有目标M4A文件。
3. 适配库的参数要求
确认Audio构造函数的参数规则:
- 第二个参数表示是否为本地文件,若传入的是本地路径,需确保该参数设置正确(通常本地文件传
true,网络文件传false); - 若音频文件在assets目录,不能直接传assets路径,需要先将文件复制到应用可访问的本地存储目录,再使用复制后的绝对路径加载。
4. 检查存储权限
- 内部存储无需额外权限,但必须使用应用专属的内部目录(如
context.filesDir); - 外部存储在Android 10及以上,建议用MediaStore或存储访问框架(SAF)获取文件,避免直接操作路径;
- Android 13+访问音频文件需申请
READ_MEDIA_AUDIO权限,低版本需申请READ_EXTERNAL_STORAGE,且要动态申请权限后再执行加载操作。
内容的提问来源于stack exchange,提问作者Umaq
相关产品推荐
相关产品推荐

