0

私はジンジャーブレッドを使ってNitroHDで開発しています。オーディオを録音したいのですが、MediaRecorder.stop()を呼び出しているときに無限のハングが発生します。

私はそれを正確に行うアプリケーションを持っているので、私の電話は音を録音できることを知っています。

Deitelらの「AndroidforProgrammers」という本を読みました。第16章にVoiceRecorderの例があります。すべて問題ないように見えますが、MediaRecorder.stop()を呼び出すと、アプリが永久にハングします。また、リソースが解放されていないため、解放するには電話を再起動する必要があります。

呼び出しが行われるコードの部分は次のとおりです(Deitel et al。、 "Android for Programmers"、Prentice Hall、2012、chap 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())行でハングします。

繰り返しますが、別のアプリが正しく動作するため、電話とそのOSが正しいことはわかっています。それで、あなたはこの問題を解決する方法について何か考えがありますか、多分回避策はありますか?

ありがとう!

編集レコーダーがstarted()されると、音の振幅のグラフを表示するために50msごとに実行されるハンドラーがあります。メソッドrecorder.getMaxAmplitude()は常に0を返します。これは、MediaRecorderが正しく初期化されていないことの症状である可能性がありますか?

4

2 に答える 2

2

setAudioEncodingBitRate()の引数が低すぎる可能性があります。

録音音声の良いsetAudioEncodingBitRateは何ですか

それがお役に立てば幸いです。

于 2013-03-25T14:50:49.347 に答える
0

その場所にヌルレコーダーを設置することができます。isCheckedのelseケースを入力した場合、新しいMediaRecorder()は作成されません。

だから、2つのこと:

APIドキュメントには、開始前にstop()を呼び出すと、RuntimeExceptionがスローされ、記録に失敗した場合はIllegalStateExceptionがスローされると記載されています。

停止を呼び出す前にレコーダーを確認してください。

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