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

Android Studio钢琴应用MediaRecorder录音报EISDIR错误求助

解决MediaRecorder的EISDIR错误问题

嘿,这个问题我太熟悉了!你遇到的java.io.FileNotFoundException: open failed: EISDIR (Is a directory)错误,核心原因很简单:你给MediaRecorder指定的输出路径是一个目录,而不是具体的音频文件。

问题根源解释

context.getExternalFilesDir(null)返回的是你的应用专属的外部存储目录路径,它是一个文件夹,不是可写入的文件。MediaRecorder需要明确知道要把音频数据写入到哪个具体文件里,直接指向目录肯定会触发这个错误。

修复步骤和修改后的代码

你需要在这个专属目录下创建一个具体的音频文件(建议带唯一标识,比如时间戳,避免重复录制时覆盖文件)。修改后的代码如下:

private void startRecording() throws IOException {
    try {
        // 获取APP专属的外部存储目录
        File appExternalDir = context.getExternalFilesDir(null);
        // 生成唯一的音频文件名,用时间戳避免重复
        String uniqueFileName = "piano_recording_" + System.currentTimeMillis() + ".3gp";
        // 创建具体的音频文件对象
        audioFile = new File(appExternalDir, uniqueFileName);
    } catch (Exception e) {
        Log.e("Error Tag", "external storage access error " + e.getMessage());
        return;
    }
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mediaRecorder.setOutputFile(audioFile.getAbsolutePath());
    mediaRecorder.prepare();
    mediaRecorder.start();
}

额外注意事项

  • 文件名后缀匹配:因为你设置的输出格式是THREE_GPP,所以文件名用.3gp后缀是对应的,这样系统能正确识别这个音频文件类型。
  • 权限问题:如果你的应用targetSdkVersion >= 29(Android 10及以上),使用APP专属外部目录不需要申请WRITE_EXTERNAL_STORAGE权限;如果低于29,需要在AndroidManifest.xml中声明权限,并且在Android 6.0+设备上请求运行时权限。
  • 文件唯一性:用System.currentTimeMillis()生成文件名是最简单的方式,确保每次录制的文件都不会被覆盖,也方便后续管理录音文件。

内容的提问来源于stack exchange,提问作者Arnab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:53:16