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());
我有一个由 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());