0

我正在用 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 初始化错误的症状?

4

2 回答 2

2

setAudioEncodingBitRate() 的参数可能太低。

什么是好的 setAudioEncodingBitRate 录制语音

希望这会有所帮助。

于 2013-03-25T14:50:49.347 回答
0

你可以在那个地方有一个空记录器。如果输入 isChecked 的 else 情况,则不会创建新的 MediaRecorder()。

所以,有两件事:

API 文档指出,如果您在开始之前调用 stop(),您将抛出 RuntimeException,如果您未能记录任何内容,您将抛出 IllegalStateException。

在调用停止之前检查记录器:

if (recorder != null) {
    recorder.stop();
    // some recorder stuff here
}
于 2013-03-24T03:36:41.257 回答