如何在Android上录制音频而不会崩溃?

时间:2013-03-24 02:44:28

标签: android debugging audio-recording

我正在使用带姜饼的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的症状?

2 个答案:

答案 0 :(得分:2)

setAudioEncodingBitRate()的参数可能太低了。

what is good setAudioEncodingBitRate on record voice

希望有帮助。

答案 1 :(得分:0)

你可以在那个地方有一个空录音机。如果输入isChecked的else案例,则不会创建新的MediaRecorder()。

所以,有两件事:

API文档说明如果在启动之前调用stop(),则会抛出RuntimeException。如果您未能记录任何内容,则会抛出IllegalStateException。

在致电停止前检查记录器:

if (recorder != null) {
    recorder.stop();
    // some recorder stuff here
}