MediaRecorder.prepare() 抛出 IOException

MediaRecorder.prepare() throwing IOException

我有一个由 MediaRecorder.prepare() 引起的 IOException,即使在多个地方搜索后,我也没有找到解决方案。为此,我使用了官方 Android 开发人员指南中的代码。我的代码如下:

private void startRecording(String fileName) {
    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mRecorder.setOutputFile(fileName);

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e("RecordApp", "prepare() failed " + fileName);
    }

    mRecorder.start();
}

我知道文件名字符串不为空,因为它由 EditText 控制,我知道它可以正常工作。

只是为了澄清字符串文件名是什么。由于我计划将此数据存储在内部存储中,因此我只有普通名称(比如我希望文件为 "test"),在本例中为字符串 "test"。但是,我不知道这是否会成为问题。

感谢任何帮助。谢谢你。

编辑 1:出现新问题(查看@Burrough post 的第一条评论)。

private void stopRecording(){
        if(recorder != null){
            recorder.stop();
        }
    }

// stopRecording name of the button.
stopRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                thread.interrupt();
                onorig=false;
                thread = null;
                startRecording.setEnabled(true);
                stopRecording.setEnabled(false);
                try {
                    Log.i("DOG", processCode(originalcode));
                    Log.i("DOG", processCode(code));
                    Log.i("DOG", Arrays.toString(checkNotes(originalcode, code)));
                } catch(NullPointerException npe){}
                code = "";
                stopRecording();
                Calendar calendar = Calendar.getInstance();
            }
        });

我正在使用 TarsosDSP 音调识别。

在@Proxytype 之后,如果 targetsdk 是 api 23 或更高版本,那么录音将被视为危险的,您每次都需要请求许可,而不仅仅是在通过清单安装时。 See docs here

检查您是否在清单中声明了权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

当然,如果您 运行 使用 android 6.0 及更高版本 - 您必须在运行时询问它们,就像任何其他危险权限一样,如果您需要有关在运行时询问权限的更多信息检查 link https://developer.android.com/training/permissions/requesting.html

并确保您的文件存在,如果不存在,您也会收到此错误,而不是找不到文件。

您的文件名导致了错误。替换为:

mRecorder.setOutputFile(fileName);

像这样:

final File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), fileName);

mRecorder.setOutputFile(outputFile.getAbsolutePath());