MediaRecorder.prepare()抛出IOException

时间:2017-07-15 22:16:50

标签: java android ioexception mediarecorder android-mediarecorder

我有一个由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&#34 ;。但是,我不知道这是不是问题。

感谢任何帮助。谢谢。

编辑1:出现一个新问题(查看@Burrough&#39的帖子中的第一条评论)。

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音高识别。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

检查您的清单中是否已声明权限:

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

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

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

答案 2 :(得分:0)

您的文件名导致错误。替换这个:

mRecorder.setOutputFile(fileName);

有这样的事情:

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

mRecorder.setOutputFile(outputFile.getAbsolutePath());