我有一个由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音高识别。
答案 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());