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

Android如何获取raw文件夹音频文件名用于CheapSoundFile类

解决Android Raw资源音频无法被CheapSoundFile加载的问题

首先得明确你遇到的核心问题:CheapSoundFile的create()方法只接受设备文件系统中的真实文件路径,而raw文件夹里的音频资源是打包在APK内部的,属于应用的资源文件,并不是设备存储里的独立文件——所以直接用资源URI转字符串、或者试图把InputStream转成路径的方式,自然会触发FileNotFoundException。

下面是具体的解决方案,核心思路是把raw资源复制到应用的私有文件目录,然后用这个真实的文件路径来加载:

步骤1:添加资源复制工具方法

在你的EvalActivity里添加一个方法,负责把raw资源复制到应用的私有files目录(这个目录只有你的应用能访问,不需要额外权限):

private File copyRawResourceToFile(int rawResId, String outputFileName) throws IOException {
    // 目标文件:应用私有files目录下的outputFileName文件
    File targetFile = new File(getFilesDir(), outputFileName);
    
    // 如果文件已经存在,直接返回,避免重复复制
    if (targetFile.exists()) {
        return targetFile;
    }

    // 从raw资源读取数据流,写入目标文件
    InputStream rawInputStream = getResources().openRawResource(rawResId);
    FileOutputStream fileOutputStream = new FileOutputStream(targetFile);

    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = rawInputStream.read(buffer)) != -1) {
        fileOutputStream.write(buffer, 0, bytesRead);
    }

    // 关闭流
    rawInputStream.close();
    fileOutputStream.close();

    return targetFile;
}

步骤2:修改加载Raw音频的代码

把你原来加载raw资源的代码替换成下面的逻辑,先复制资源再加载:

// 替换原来的CheapSoundFile fileSource = ... 这段代码
try {
    // 复制raw资源到私有目录,注意第二个参数要和你的音频格式匹配(比如.wav/.mp3)
    File rawAudioFile = copyRawResourceToFile(R.raw.abaa, "abaa.wav");
    // 获取真实的文件系统路径
    String rawFilePath = rawAudioFile.getAbsolutePath();

    // 现在用这个路径加载音频,和你处理录制的音频逻辑一致
    CheapSoundFile fileSource = CheapSoundFile.create(rawFilePath, listener);

    // 后续的逻辑保持不变
    int sampleRateAbaa = fileSource.getSampleRate();
    String audioRawFolder = "" + sampleRateAbaa;
    hammingWindow.setText(audioRawFolder);
} catch (IOException e) {
    e.printStackTrace();
}

为什么之前的方法行不通?

  • 资源URI不是文件路径:android.resource://...是Android的内容URI,指向APK内部的资源,并不是设备文件系统中的路径,CheapSoundFile无法解析这种格式的路径。
  • InputStream没有对应的路径:InputStream是内存中的数据流,不存在对应的文件系统路径,所以你试图把它转成字符串路径的方式从根本上就不成立。

额外注意事项

  • 确保outputFileName的后缀和你的raw音频格式一致(比如你的raw文件是WAV就用.wav,MP3就用.mp3),避免CheapSoundFile识别格式出错。
  • 工具方法里加入了文件存在判断,只会复制一次,后续再打开时直接复用已复制的文件,提升性能。

内容的提问来源于stack exchange,提问作者Mohamad Handy Nugraha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:09