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
相关产品推荐
相关产品推荐

