我正在使用带姜饼的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())行上挂起。
我再说一遍,我知道手机及其操作系统是正确的,因为另一个应用程序正常工作。那么,你对如何解决这个问题有什么想法,可能会解决这个问题吗?
谢谢!
编辑当录音机启动时(),有一个处理程序在每50ms执行一次,以显示声音幅度的图形。方法recorder.getMaxAmplitude()总是返回0.也许这是初始化严重的MediaRecorder的症状?
答案 0 :(得分:2)
答案 1 :(得分:0)
你可以在那个地方有一个空录音机。如果输入isChecked的else案例,则不会创建新的MediaRecorder()。
所以,有两件事:
API文档说明如果在启动之前调用stop(),则会抛出RuntimeException。如果您未能记录任何内容,则会抛出IllegalStateException。
在致电停止前检查记录器:
if (recorder != null) {
recorder.stop();
// some recorder stuff here
}