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

