我正在用 Gingerbread 开发 Nitro HD。我想录制音频,但在调用 MediaRecorder.stop() 时遇到无限挂起。
我知道我的手机可以录制声音,因为我有一个完全可以做到这一点的应用程序。
我阅读了 Deitel 等人的《程序员的 Android》一书。还有第 16 章中的 VoiceRecorder 示例。一切看起来都很好,但是应用程序在调用 MediaRecorder.stop() 时会永远挂起。另外,资源没有释放,我必须重启手机才能释放它。
这是完成调用的代码部分(参见 Deitel 等人,“Android for Programmers”,Prentice Hall,2012,第 16 章):
// starts/stops a recording
OnCheckedChangeListener recordButtonListener =
new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked)
{
if (isChecked)
{
visualizer.clear(); // clear visualizer for next recording
saveButton.setEnabled(false); // disable saveButton
deleteButton.setEnabled(false); // disable deleteButton
viewSavedRecordingsButton.setEnabled(false); // disable
// create MediaRecorder and configure recording options
if (recorder == null)
recorder = new MediaRecorder(); // create MediaRecorder
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(
MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
try
{
// create temporary file to store recording
File tempFile = File.createTempFile(
"VoiceRecorder", ".3gp", getExternalFilesDir(null));
// store File as tag for saveButton and deleteButton
saveButton.setTag(tempFile);
deleteButton.setTag(tempFile);
// set the MediaRecorder's output file
recorder.setOutputFile(tempFile.getAbsolutePath());
recorder.prepare(); // prepare to record
recorder.start(); // start recording
recording = true; // we are currently recording
handler.post(updateVisualizer); // start updating view
} // end try
catch (IllegalStateException e)
{
Log.e(TAG, e.toString());
} // end catch
catch (IOException e)
{
Log.e(TAG, e.toString());
} // end catch
} // end if
else
{
recorder.stop(); // stop recording
recorder.reset(); // reset the MediaRecorder
recording = false; // we are no longer recording
saveButton.setEnabled(true); // enable saveButton
deleteButton.setEnabled(true); // enable deleteButton
recordButton.setEnabled(false); // disable recordButton
} // end else
} // end method onCheckedChanged
}; // end OnCheckedChangedListener
在调试会话中,输入了“else”范围,但它挂在其第一行 (stop()) 上。
我再说一遍,我知道手机及其操作系统是正确的,因为另一个应用程序可以正常工作。那么,您对如何解决这个问题有任何想法,也许可以解决?
谢谢!
编辑当录音机启动()时,有一个处理程序每 50 毫秒执行一次,以显示声音幅度的图表。recorder.getMaxAmplitude() 方法总是返回 0。也许这是 MediaRecorder 初始化错误的症状?